2011-07-01 49 views
2

我想在Python中使用Tkinter模塊創建GUI,其中一部分涉及給用戶兩個射頻盒的選項,並選擇他們想要的選項。根據他們打勾的方塊,它會運行不同的函數,返回不同的結果 - 然後我想在窗口類之外使用結果。但我不知道如何將價值從課堂內部傳遞到課堂外;我相信它非常簡單,但我無法爲我的生活工作。從Tkinter中的射頻盒獲取價值 - Python

我當前的代碼是:

class BatchIndiv(): 
def __init__(self, master): 
    self.master=master 
    self.startwindow() 
    self.b=0 

def startwindow(self): 

    self.var1 = IntVar() 
    self.textvar = StringVar() 

    self.Label1=Label(self.master, text="Batch or indivdual import?") 
    self.Label1.grid(row=0, column=0) 

    self.Label2=Label(self.master, textvariable=self.textvar) 
    self.Label2.grid(row=2, column=0) 

    self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1, 
          value=1, command=self.cb1select) 
    self.rb1.grid(row=1, column=0, sticky=W) 

    self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1, 
          value=2, command=self.cb1select) 
    self.rb2.grid(row=1, column=1, sticky=W) 

    self.Button1=Button(self.master, text="ok", command=self.ButtonClick) 
    self.Button1.grid(row=1, column=2) 

def ButtonClick(self): 
    if (self.var1.get())==1: 
     b=BatchImport() 
     return b 
     self.master.quit() 
     self.master.destroy() 
    elif (self.var1.get())==2: 
     b=IndivImport() 
     return b 
     self.master.quit() 
     self.master.destroy() 
    else: pass 

def cb1select(self): 
    return self.var1.get() 

#End of class definition. 
#Code: 

root=Tk() 
window=BatchIndiv(root) 
b=BatchIndiv.ButtonClick.b 
root.mainloop() 

.... 

對待BatchImport和IndivImport用作黑盒子,它們只是返回整數值,這是我分配給變量B的內部ButtonClick()。我需要這個值來做一些低於root.mainloop()的東西,(即......的地方),但我不知道如何得到它。 Tkinter真的很刺激,特別是因爲每個人都有不同的處理方法,所以在線文檔是不一樣的 - 試着做各種各樣的文檔,它給了我更多可愛的錯誤信息。

任何和所有幫助,將不勝感激。

PS - 當按下按鈕時如何關閉窗口,還是將值b發送回代碼的其餘部分,而不是完全退出python?正如你可以看到我嘗試使用.quit()和.destroy(),但沒有運氣。

回答

1

你的變量b就是您的本地類,(你做destroyquit後),所以你的類被刪除的那一刻,b被摧毀。因此,將變量b定義爲全局變量。

b = 0     # this is now in the global namespace 

class BatchIndiv(): 
    def __init__(self, master): 
     self.master=master 
     self.startwindow() 
     #self.b=0  # no need for this, directly store in the global variable 

    def startwindow(self): 

     self.var1 = IntVar() 
     self.textvar = StringVar() 

     self.Label1=Label(self.master, text="Batch or indivdual import?") 
     self.Label1.grid(row=0, column=0) 

     self.Label2=Label(self.master, textvariable=self.textvar) 
     self.Label2.grid(row=2, column=0) 

     self.rb1 = Radiobutton(self.master, text="Batch", variable=self.var1, 
           value=1, command=self.cb1select) 
     self.rb1.grid(row=1, column=0, sticky=W) 

     self.rb2 = Radiobutton(self.master, text="Individual", variable=self.var1, 
           value=2, command=self.cb1select) 
     self.rb2.grid(row=1, column=1, sticky=W) 

     self.Button1=Button(self.master, text="ok", command=self.ButtonClick) 
     self.Button1.grid(row=1, column=2) 

    def ButtonClick(self): 
     global b 
     if (self.var1.get())==1: 
      b=BatchImport() 
      self.master.quit() 
      #self.master.destroy() # either quit or destroy, I think one is sufficient, but confirm to be sure. 
     elif (self.var1.get())==2: 
      b=IndivImport() 
      self.master.quit() 
      #self.master.destroy() # either quit or destroy, I think one is sufficient, but confirm to be sure 
     else: pass 

    def cb1select(self): 
     return self.var1.get() 

#End of class definition. 
#Code: 

root=Tk() 
window=BatchIndiv(root) 
root.mainloop() 

# now do here whatever you want to do with the variable b 
print b 

(使用全局變量是不是一個好主意,但因爲我不知道你想b做什麼,我不能夠提出任何東西。)

+0

是的,這正是我最終做的。謝謝。 –

1

一般來說,在調用mainloop之後,你永遠不應該有任何代碼,這不僅僅是GUI程序的工作方式。

當用戶按下按鈕時,所有的工作都應該發生(或從其開始)按鈕的命令。如果您希望程序退出,則會銷燬根窗口(導致mainloop方法退出),並且程序結束。在主循環之後,你不應該跑東西。

...因此,如何將數據從按鈕傳遞到代碼mainloop後的問題變得沒有實際意義。

因此,創建一個方法,可以在您的示例中執行任何操作...。從ButtonClick內調用該方法,當您調用它時,您可以從GUI中傳入所需的任何信息。

ButtonClick就變成這樣的:

def ButtonClick(self): 
    if self.var1.get()==1: 
     b=BatchImport() 

    elif self.var1.get()==2: 
     b=IndivImport() 

    self.DotDotDot(b) 
    self.master.quit() 
+0

呀,最後我將我所有的代碼放入類中,但我現在正在按部就班地進行,以確保一切正常。謝謝:) –