2014-03-27 47 views
0

我正在使用該程序來選擇(通過單選按鈕)要在項目中使用的模型。相應地,程序將計算失敗的可能性。 我用這個代碼:Python - 單選按鈕和變量

from Tkinter import * 
menu=Tk()  
def novo(n) 
failure=random.randrange(10) 
if n==1: 
    n=failure+5 
if n==2: 
    n=failure+10 
if n==3: 
    n=failure+15 
return n  
l1=Label(menu,text=" What model to use?").pack() 
r1=Radiobutton(menu,text=' model 1',value=1,command=novo(1)).pack() 
r2=Radiobutton(menu,text=' model 2',value=2,command=novo(2)).pack() 
r3=Radiobutton(menu,text=' model 3',value=3,command=novo(3)).pack() 
l2=Label(menu,text="Probability of failure:).pack() 
l3=Label(menu,textvariable=n).pack() 
b1=Button(menu,text="quit",command=menu.destroy).pack()  
menu.mainloop() 

Цhen我運行該程序,會出現只與單選按鈕和文本菜單窗口的「失敗的概率」。 爲什麼不打印函數novo()的結果?

+0

您的縮進混亂了,並且您有幾個語法錯誤。這段代碼不可能給你所說的錯誤或行爲,因爲它根本無法運行。請發佈_actual_代碼。 –

回答

0

讓我們來看看在這行代碼:

r1=Radiobutton(menu,text=' model 1',value=1,command=novo(1)).pack() 

有兩個錯誤的代碼。第一個與您的問題有關的問題是,該代碼將在創建按鈕時調用novo,並且該函數返回的任何內容都將賦予command屬性。

command屬性引用一個函數。相反,你是調用函數,並使用結果。最簡單的解決方案是使用lambda,這可以很容易地創建一個匿名函數。然後,該匿名函數可以調用你的函數參數:

r1=Radiobutton(..., command=lambda: novo(1))... 

對於更詳細的解釋,搜索拉姆達Tkinter的問題 - 這個問題被提出並回答了很多。

第二個問題是,r1(和所有其他類似變量)將始終爲None。在python中,當你做類似x=foo().bar()的時候,x總是會得到最後一個函數的結果。因此,當您做r1=Radiobutton(...).pack(...)時,您總是會得到pack()的結果,總是None

Tkinter的最佳實踐是將小部件的創建與小部件的佈局分開。在你的情況下,這並不重要,因爲你永遠不會重用這些變量,但你應該養成這種編碼的習慣。例如:

r1 = Radiobutton(...) 
r2 = Radiobutton(...) 
r3 = Radiobutton(...) 
... 
r1.pack() 
r2.pack() 
r3.pack() 
... 

這樣做的好處是使代碼更容易維護,因爲所有佈局代碼都在同一個位置。我看到很多問題,人們無法理解他們的代碼爲什麼看起來不像他們期望的那樣,而這往往歸結爲他們在代碼中散佈了網格和/或包裝語句,這使得很難看到錯誤或可視化代碼應該做什麼。