2011-08-30 127 views
4

點擊級聯中的命令按鈕後,我想保持菜單級聯打開。所以它基本上只在用戶點擊其他地方時纔會關閉(就像通常那樣)。似乎無法找到一個合適的選項或方法來打開回調中的菜單。 invoke()函數僅適用於級聯右側的按鈕?你會怎麼做?在Tkinter中打開菜單

回答

3

是的,我知道這是很久以前問過的,但我很好奇是否有辦法用tkinter來完成這個任務,所以我弄了一會兒,弄清楚了怎麼做。我無法想出一種方法來將持久性菜單正確放置在最初打開時的位置,但我已設法使其保留在您請求的任何位置(我使用根窗口的左上角)。是的,我知道這不是一個很好的適當的基於類的實現,但我只是簡單地進行測試,因爲我可以編寫而不用太多的無關細節來掩蓋它。

try: 
    from tkinter import * 
    from tkinter.ttk import * 
except: 
    from Tkinter import * 
    from ttk import * 

root = Tk() 
var = StringVar() 

def menu_click(menu, item): 
    global root 
    var.set(item) 
    menu.post(root.winfo_rootx(), root.winfo_rooty()) 

root.option_add('*tearOff', False) # remove tearoff from all menus 
Label(root, textvariable=var).pack() # just to give menu clicks some feedback 
root.geometry('400x300') 
menubar = Menu(root) 
root['menu'] = menubar 
menu_test = Menu(menubar) 
menubar.add_cascade(menu=menu_test, label='Test') 
menu_test.add_command(label='One', command=lambda: menu_click(menu_test, 'One')) 
menu_test.add_command(label='Two', command=lambda: menu_click(menu_test, 'Two')) 
menu_test.add_command(label='Three', command=lambda: menu_click(menu_test, 'Three')) 
menu_cas = Menu(menu_test) 
menu_test.add_cascade(menu=menu_cas, label='Four') 
menu_cas.add_command(label='One', command=lambda: menu_click(menu_cas, 'Fourty One')) 
menu_cas.add_command(label='Two', command=lambda: menu_click(menu_cas, 'Fourty Two')) 
menu_cas.add_command(label='Three', command=lambda: menu_click(menu_cas, 'Fourty Three')) 
root.mainloop()