2015-11-17 118 views
0

我想學習Python並試圖建立一個GUI。我面臨的一個問題如下:如何從子窗口獲取GUI主窗口中的數據?

在我的代碼中,我試圖從'Ausgewahlte'複選框被選中時從用戶那裏獲得輸入,當選擇打開子窗口並允許用戶輸入數據。現在我必須告訴主GUI從Child窗口獲取數據,或根據'Alle'或'Ausgewahlte'之間的選擇使用默認數據。

首先,我無法使用主GUI中Child窗口中定義的數據。

如果你們中的任何人都能幫上忙,那將會很棒。

感謝您的期待!

問候

`

import Tkinter 
import tkSimpleDialog 

class PST_TEG(Tkinter.Tk): 

    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 

     # Label 
     self.grid() 
     label = Tkinter.Label(self,text="Projekt Root Ordner Name :",anchor="w").grid(column=0,row=0,columnspan=1,sticky='EW') 
     label = Tkinter.Label(self,text="Projekt Name :",anchor="w").grid(column=0,row=1,columnspan=1,sticky='EW') 
     label = Tkinter.Label(self,text="Experiment Name :",anchor="w").grid(column=0,row=2,columnspan=1,sticky='EW')   
     label = Tkinter.Label(self,text="Plattform Name :",anchor="w").grid(column=0,row=3,columnspan=1,sticky='EW') 
     label = Tkinter.Label(self,text="Anzahl der Szenarien :",anchor="w").grid(column=0,row=4,columnspan=1,sticky='EW') 
     label = Tkinter.Label(self,text="Temperatur Kuhlwasser :",anchor="w").grid(column=0,row=5,columnspan=1,sticky='EW') 
     label = Tkinter.Label(self,text="Szenarien :",anchor="w").grid(column=0,row=6,columnspan=1,sticky='EW') 

     # Entry 

     self.entry1=Tkinter.Entry(self) 
     self.entry1.grid(column=1,row=0,sticky='EW',pady=5) 
     self.entry2=Tkinter.Entry(self) 
     self.entry2.grid(column=1,row=1,sticky='EW',pady=5) 
     self.entry3=Tkinter.Entry(self) 
     self.entry3.grid(column=1,row=2,sticky='EW',pady=5) 
     self.entry4=Tkinter.Entry(self) 
     self.entry4.grid(column=1,row=3,sticky='EW',pady=5) 
     self.entry5=Tkinter.Entry(self) 
     self.entry5.grid(column=1,row=4,sticky='EW',pady=5) 
     self.entry6=Tkinter.Entry(self) 
     self.entry6.grid(column=1,row=5,sticky='EW',pady=5) 


     # Checkbutton 
     global CheckVar1 
     global CheckVar2 
     global Checkbutton1 
     global Checkbutton2 
     CheckVar1= Tkinter.IntVar() 
     CheckVar2=Tkinter.IntVar() 
     Checkbutton1=Tkinter.Checkbutton(self, text="Alle Szenarien",variable=CheckVar1,command=self.alle).grid(column=1,row=6,pady=10,sticky='W') 
     Checkbutton2=Tkinter.Checkbutton(self, text="Ausgewählte",variable=CheckVar2,command=self.selected).grid(column=1,row=6,padx=110,sticky='W') 

     # Button 

     button1 = Tkinter.Button(self,text=u"Übernehmen",command=self.Uebernehmen) 
     button1.grid(column=1,row=8,pady=10,columnspan=1,sticky='W') 
     button2 = Tkinter.Button(self,text=u"Reset",command=self.clear_fields) 
     button2.grid(column=1,row=8,pady=10,padx=90,sticky='W') 

    def OnButtonClick(self): 

     global Anzahl_Szenarien1 
     global Anfang_Temperatur1 
     global Szenario_all 
     global Szenario_all1 
     global Szenario_selected 
     global ProjectRoot1 
     global ProjectName1 
     global ExperimentName1 
     global PlatformName1 

     ProjectRoot1=self.entry1.get() 
     ProjectName1=self.entry2.get() 
     ExperimentName1=self.entry3.get() 
     PlatformName1= self.entry4.get() 
     Anzahl_Szenarien1 = int(self.entry5.get()) 
     Anfang_Temperatur1 = int(self.entry6.get()) 

     print 'Projekt ordner: %s' % ProjectRoot1 
     print 'Projekt Name: %s' % ProjectName1 
     print 'Experiment Name: %s' % ExperimentName1 
     print 'Platform Name: %s' % PlatformName1 
     print 'Anzahl Szenarien: %d' % Anzahl_Szenarien1 
     print 'Temperatur Kuhlwasser: %d' % Anfang_Temperatur1 




    def clear_fields(self): 

     self.entry1.delete(0, 'end') 
     self.entry2.delete(0, 'end') 
     self.entry3.delete(0, 'end') 
     self.entry4.delete(0, 'end') 
     self.entry5.delete(0, 'end') 
     self.entry6.delete(0, 'end') 

     if(CheckVar1.get()): 
      CheckVar1.set(0) 

     if(CheckVar2.get()): 
      CheckVar2.set(0) 

    def new_data(self,data): 
     Szenario_all=data 
     self.OnButtonClick() 
     print Szenario_all 

    def alle(self): 


     self.OnButtonClick() 
     all=Anzahl_Szenarien1 
     all=all+1 
     Szenario_all=list(range(1,all)) 
     print Szenario_all 

    def selected(self): 

     child_window(self.parent)   

    def Uebernehmen(self): 

     master.destroy() 

class child_window(Tkinter.Tk): 

    def __init__(self,parent): 
     self.root = Tkinter.Toplevel(parent) 
     label = Tkinter.Label(self.root,text="Bitte geben Sie die Szenarien nummer ein :",anchor="w").grid(column=0,row=0,columnspan=1,sticky='EW') 
     self.root.entry1=Tkinter.Entry(self.root) 
     self.root.entry1.grid(column=0,row=1,sticky='EW',padx=10) 

     self.ok_button = Tkinter.Button(self.root,text=u"OK",command=self.closechild).grid(column=1,row=2,pady=10,columnspan=1,sticky='W') 


    def closechild(self): 

     Szenario_all1= self.root.entry1.get() 
     self.parent.new_data(Szenario_all1) 

     self.root.destroy() 



if __name__ == "__main__": 

    master = PST_TEG(None) 
    master.title('PST TEG') 
    w = 400 
    h = 275 
    ws = master.winfo_screenwidth() 
    hs = master.winfo_screenheight() 
    x = (ws/2) - (w/2) 
    y = (hs/2) - (h/2) 
    master.geometry('%dx%d+%d+%d' % (w, h, x, y)) 
    master.mainloop()` 

回答

0

如果我得到它的權利...... 對於這種投入(字符串我想)你可以使用

tkSimpleDialog.askstring(title, prompt [,options]) 

要創建一個對話框。該函數返回輸入的字符串。

+0

您好....感謝您的回覆。你是對的,我可以使用SimpleDialog,但我不想取消按鈕,這就是爲什麼我沒有使用它。 – Grover

3

這是一個從子窗口修改父窗口的示例。

selected()方法通過self參數將是子窗口的父項。

def selected(self): 
    child_window(self) 

您可以按以下更改child_window:

class child_window(Tkinter.Tk): 

    def __init__(self,parent): 

     #Save parent reference 

     self.parent = parent 
     self.root = Tkinter.Toplevel(parent) 
     label = Tkinter.Label(self.root,text="Bitte geben Sie die Szenarien nummer ein :",anchor="w").grid(column=0,row=0,columnspan=1,sticky='EW') 

     #Create your widget as this, simple to read. 

     self.entry1 = Tkinter.Entry(self.root) 
     self.entry1.grid(column=0,row=1,sticky='EW',padx=10) 

     self.ok_button = Tkinter.Button(self.root,text=u"OK",command=self.closechild).grid(column=1,row=2,pady=10,columnspan=1,sticky='W') 


    def closechild(self): 

     Szenario_all1= self.entry1.get() 

     #self.parent.new_data(Szenario_all1) 

     #To change parent value of entry1 from here 
     #just call insert() method. 

     self.parent.entry1.insert(0, Szenario_all1) 

     #To delete content of self.parent.entry1 use: 
     #self.parent.entry1.delete(0, len(self.parent.entry1.get())) 

     self.root.destroy() 
0

我會使用的 「Ausgewahlte」 選項另一項。最初,您可以將該條目設置爲禁用,以便無法輸入文本。

self.entry7=Tkinter.Entry(self, state = 'disabled') 

當「Ausgewahlte」複選框被選中,那麼您可以啓用項允許用戶輸入他/她的文字。

self.entry7['state'] = 'normal' 

而且我會避免使用全局變量,你可以只將它們添加到類像這樣:

self.variableName = ... 

所以在最後我會做這樣的事情:

import Tkinter 
import tkSimpleDialog 

class PST_TEG(Tkinter.Tk): 

def __init__(self,parent): 
    Tkinter.Tk.__init__(self,parent) 
    self.parent = parent 
    self.initialize() 

def initialize(self): 

    # Label 
    self.grid() 
    label = Tkinter.Label(self,text="Projekt Root Ordner Name :",anchor="w").grid(column=0,row=0,columnspan=1,sticky='EW') 
    label = Tkinter.Label(self,text="Projekt Name :",anchor="w").grid(column=0,row=1,columnspan=1,sticky='EW') 
    label = Tkinter.Label(self,text="Experiment Name :",anchor="w").grid(column=0,row=2,columnspan=1,sticky='EW')   
    label = Tkinter.Label(self,text="Plattform Name :",anchor="w").grid(column=0,row=3,columnspan=1,sticky='EW') 
    label = Tkinter.Label(self,text="Anzahl der Szenarien :",anchor="w").grid(column=0,row=4,columnspan=1,sticky='EW') 
    label = Tkinter.Label(self,text="Temperatur Kuhlwasser :",anchor="w").grid(column=0,row=5,columnspan=1,sticky='EW') 

    label = Tkinter.Label(self,text="Ausgewahlte :",anchor="w").grid(column=0,row=6,columnspan=1,sticky='EW') 

    label = Tkinter.Label(self,text="Szenarien :",anchor="w").grid(column=0,row=7,columnspan=1,sticky='EW') 
    # Entry 

    self.entry1=Tkinter.Entry(self) 
    self.entry1.grid(column=1,row=0,sticky='EW',pady=5) 
    self.entry2=Tkinter.Entry(self) 
    self.entry2.grid(column=1,row=1,sticky='EW',pady=5) 
    self.entry3=Tkinter.Entry(self) 
    self.entry3.grid(column=1,row=2,sticky='EW',pady=5) 
    self.entry4=Tkinter.Entry(self) 
    self.entry4.grid(column=1,row=3,sticky='EW',pady=5) 
    self.entry5=Tkinter.Entry(self) 
    self.entry5.grid(column=1,row=4,sticky='EW',pady=5) 
    self.entry6=Tkinter.Entry(self) 
    self.entry6.grid(column=1,row=5,sticky='EW',pady=5) 
    self.entry7=Tkinter.Entry(self, state = 'disabled') 
    self.entry7.grid(column=1,row=6,sticky='EW',pady=5) 


    # Checkbutton 
    self.CheckVar1= Tkinter.IntVar() 
    self.CheckVar2=Tkinter.IntVar() 
    self.Checkbutton1=Tkinter.Checkbutton(self, text="Alle Szenarien",variable=self.CheckVar1,command=self.alle).grid(column=1,row=7,pady=10,sticky='W') 
    self.Checkbutton2=Tkinter.Checkbutton(self, text="Ausgewahlte",variable=self.CheckVar2,command=self.selected).grid(column=1,row=7,padx=110,sticky='W') 
    # Button 

    button1 = Tkinter.Button(self,text=u"Ubernehmen",command=self.Uebernehmen) 
    button1.grid(column=1,row=10,pady=10,columnspan=1,sticky='W') 
    button2 = Tkinter.Button(self,text=u"Reset",command=self.clear_fields) 
    button2.grid(column=1,row=10,pady=10,padx=90,sticky='W') 

def OnButtonClick(self): 

    self.ProjectRoot1=self.entry1.get() 
    self.ProjectName1=self.entry2.get() 
    self.ExperimentName1=self.entry3.get() 
    self.PlatformName1= self.entry4.get() 
    self.Anzahl_Szenarien1 = int(self.entry5.get()) 
    self.Anfang_Temperatur1 = int(self.entry6.get()) 

    print 'Projekt ordner: %s' % self.ProjectRoot1 
    print 'Projekt Name: %s' % self.ProjectName1 
    print 'Experiment Name: %s' % self.ExperimentName1 
    print 'Platform Name: %s' % self.PlatformName1 
    print 'Anzahl Szenarien: %d' % self.Anzahl_Szenarien1 
    print 'Temperatur Kuhlwasser: %d' % self.Anfang_Temperatur1 


def clear_fields(self): 

    self.entry1.delete(0, 'end') 
    self.entry2.delete(0, 'end') 
    self.entry3.delete(0, 'end') 
    self.entry4.delete(0, 'end') 
    self.entry5.delete(0, 'end') 
    self.entry6.delete(0, 'end') 
    self.entry7.delete(0, 'end') 
    self.entry7['state'] = 'disabled' 

    if(self.CheckVar1.get()): 
     self.CheckVar1.set(0) 

    if(self.CheckVar2.get()): 
     self.CheckVar2.set(0) 

def new_data(self,data): 
    self.Szenario_all = data 
    self.OnButtonClick() 
    print Szenario_all 

def alle(self): 
    self.OnButtonClick() 
    all = self.Anzahl_Szenarien1 
    all = all+1 
    Szenario_all = list(range(1,all)) 
    print Szenario_all 

def selected(self): 
    self.entry7['state'] = 'normal' 

def Uebernehmen(self): 
    master.destroy() 



if __name__ == "__main__": 

master = PST_TEG(None) 
master.title('PST TEG') 
w = 400 
h = 290 
ws = master.winfo_screenwidth() 
hs = master.winfo_screenheight() 
x = (ws/2) - (w/2) 
y = (hs/2) - (h/2) 
master.geometry('%dx%d+%d+%d' % (w, h, x, y)) 
master.mainloop() 
+0

非常感謝。即使我不想使用全局變量,但是我正在使用全局變量,因爲我將這個GUI導入另一個腳本中,GUI中定義的變量將用於其他腳本中。這已經奏效了,但如果你可以建議除了使用全局之外的另一種方式,那將是很棒的。 – Grover

+0

我通常做的是避免使用全局變量,而是創建一個文件(讓我們稱之爲「sharedVar.py」),在這裏我聲明瞭將在不同模塊之間共享的所有變量。每個模塊將只導入該文件並使用已在其中聲明的變量。 – toti08

+0

這確實是一個好主意。非常感謝。 – Grover