2011-08-30 12 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() 
관련 문제