2013-01-01 69 views
1

代碼,我可以在Tkinter註冊更改事件回調嗎?

from Tkinter import * 

master = Tk() 
Label(master, text="Current Age: ").grid(row=0, column=0) 
current = StringVar(master) 
current.set("0") 

coption = OptionMenu(master, current, *[str(i) for i in range(95)]) 
coption.grid(row=0,column=1) 

Label(master, text="Target Age: ").grid(row=1, column=0) 

target = StringVar(master) 
target.set("0") # default deger 

toption = OptionMenu(master, target, *[str(i) for i in range(95)]) 
toption.grid(row=1,column=1) 

mainloop() 

我有2個組合框,一個是目前的年齡,一個是目標年齡。我希望目標年齡僅包含高於當前年齡的值。因此,我認爲我需要以某種方式註冊更改回調。我搜索了谷歌,但它沒有幫助。

回答

2

在這裏,你有修改目標menuoptions功能和觸發它的事件:

def changed(*args): 
    start = current.get() 
    print(start) 
    menu = toption["menu"] 
    menu.delete(0, END) 
    for age in range(int(start), 95): 
     menu.add_command(label=age, 
         command=lambda v=target, l=age: v.set(l))     
    target.set(start) 

current.trace('w', changed) 

這已經部分來自hereherehere

+0

感謝。但是,在設定目前的年齡後,目標年齡會變得固定,我無法再改變它的價值。 – yasar

+0

@ yasar11732檢查更正的代碼。這個對我有用 – joaquin

1

應該明確的是,OptionMenu是這種情況一個糟糕的選擇,沒有人喜歡選擇超過95項的菜單中的選項。無論如何,你不必依賴於Tcl變量跟蹤做更新,只記得大概的command論點OptionMenu接受。利用這一點,你的問題就解決了,如:

import Tkinter 

AGELIMIT = 95 
AGEOPT = [str(i) for i in range(AGELIMIT)] 

def update_agelist(currage): 
    # Rewrite the Menubutton associated with the Optionmenu. 
    menu = toption['menu'] 
    menu.delete(0, 'end') 
    for age in range(int(currage), AGELIMIT): 
     menu.add_command(label=age, command=Tkinter._setit(target, age)) 

    target.set(currage) 


master = Tkinter.Tk() 
Tkinter.Label(text=u"Current Age: ").grid(row=0, column=0) 

current = Tkinter.StringVar(value='0') 
coption = Tkinter.OptionMenu(master, current, *AGEOPT, command=update_agelist) 
coption.grid(row=0,column=1) 

Tkinter.Label(text=u"Target Age: ").grid(row=1, column=0) 

target = Tkinter.StringVar(value='0') 
toption = Tkinter.OptionMenu(master, target, *AGEOPT) 
toption.grid(row=1, column=1) 

master.mainloop() 
相關問題