2013-04-08 72 views
4

我正在使用Python 2.7,如果這很重要。爲什麼只有一些Tkinter回調函數需要參數,而另一些則不需要

這裏是我寫的一個有趣的代碼:

def p(): 
    root = Tk() 

    def cmd(event): 
     print int(slider.get()) 

    slider = Scale(root, orient = "horizontal", from_ = 0, to = 100, command = cmd, state = "disabled") 

    def enable(): 
     slider.config(state = "active") 

    b = Button(root, text = "Enable slider", command = enable) 

    b.grid() 
    slider.grid(row = 1) 

    root.mainloop() 

對於這個代碼,我想知道爲什麼規模的命令需要一個事件,但對於按鈕不。看起來對於Tkinter中的一些小部件來說,他們的命令需要有「事件」作爲參數,而其他的則不然。爲什麼?如何區分它們?

謝謝。

回答

4

Scale不是參加活動。它採用當前值。試試這個:

def cmd(value): 
    print int(value) 

如果你讀了Tk tutorial,它說明了這一點:

有一個"command"配置選項,它可以讓你指定一個腳本,每當規模改口叫。每次調用這個腳本時(我們看到一個類似的東西,額外的參數被添加到滾動條回調和它們滾動的小部件上),Tk會自動附加當前的比例值作爲參數。

或者,如果你讀了實際manpage

指定Tcl命令的前綴每當規模的值是通過組件命令改爲調用。實際的命令由這個選項組成,後面跟着一個空格和一個實際的數字,表示該比例的新值。

換句話說,區分它們的方法是閱讀文檔。不幸的是,Tkinter docs並不完整 - 他們假設你已經知道Tcl/Tk是如何工作的,或者如何自己查看它。這就是爲什麼文檔從Tk文檔的鏈接列表開始。

如果希望通過試錯來弄明白,這並不難,看看有什麼獲取傳遞:

def cmd(*args): 
    print('Scale command says {}'.format(args)) 

def enable(*args): 
    print('Button command says {}'.format(args)) 

但是,這並不總是告訴你,你需要知道的一切;還有其他回調的參數不夠明顯,沒有更多的工作或者可以配置(例如驗證回調)。

+0

謝謝。我正在使用這個(http://www.pythonware.com/media/data/an-introduction-to-tkinter。pdf)太舊了,所以我對某些概念感到困惑。感謝這些例子! – octref 2013-04-08 21:33:38

2

當您設置一個綁定(使用bind)命令時,回調總是被賦予一個事件對象。

當您使用小部件的command屬性時,不同的小部件向命令發送不同的信息。在這種情況下,他們從不發送事件,但他們會發送其他類型的數據。這僅僅是由於不同的命令做了不同的事情。

規模小部件沒有不同 - 你聲稱回調需要一個事件,但這是錯誤的。它傳遞了尺寸小部件的當前值而不是事件對象。

相關問題