2014-02-16 3 views
0

내 응용 프로그램의 요구에 맞는 메뉴를 만드는 데 문제가 있습니다. 사용자가 소스 메뉴의 내부 비교를 위해 가능한 항목을 선택하도록 요구하는 앱을 만들고 있습니다.Python Tkinter 하위 메뉴 라디오 버튼

지금 내 메뉴 조직 같은 것을보고 indended됩니다

FILE | EDIT | OPTIONS | SOURCE | HELP 

내 문제는 소스 내부 선택의 수 (~ 100) 매우 크고 navicable 할 필요가있다 신속하게 (< 오초) 또는 내 응용 프로그램의 대상 사용자가 아마 그것을 사용하지 않습니다.

내가 생각한 해결책은 그들이 나온 데이터 구조 아래에 옵션을 중첩시키는 것입니다. 효과적으로 이것은 내가 두 목록으로 소스 옵션 및 하위 옵션을 처리 할 수 ​​있습니다 의미 :

["Data1", "Data2", "Data3"] 

[["Option1_1", "Option1_2", "Option1_3"], 
["Option2_1","Option2_2","Option2_3"], 
["Option3_1","Option3_2","Option3_3"]] 

내가 광범위하게 검색하고 Tkinter를 효과적으로 하위 메뉴를 만드는 방법을 찾을 수 있습니다. radiobuttons의 하위 메뉴 (checkbuttons도 작동합니다)가 표시되면 버튼 클릭으로 명령이 활성화되지 않고 실행 가능한 솔루션이 아닙니다. 내가하고 싶은 무엇

내가이 작업을 수행 할 수있는 방법

FILE | SOURCE | ETC... 
      Data1 | 
       Option1_1 
       Option1_2 
       Option1_3 
     Data2 | 
     Data3 

같은 것을 보이는 메뉴를 만들인가? 가급적이면 버튼을 목록에 저장 한 다음 메뉴에 추가하여 선택 호출 및 선택 취소가 가능하도록해야합니다. Radiobuttons 또는 checkbuttons가 작동 할 것이고, checkbuttons가 선호됩니다. 당신은 메뉴에 Checkbutton 또는 Button 인스턴스를 추가 할 수 없습니다

from Tkinter import * 
class App(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.makeMenu(master) 

    def makeMenu(self, parent): 
     menuBar = Frame(parent, relief = 'raised', borderwidth = 1) 
     fileMenu = Menubutton(menuBar, text = "File") 
     fileMenu.pack(side = 'left') 
     fileMenu.menu = Menu(fileMenu, tearoff = 0) 
     load = Menubutton(fileMenu.menu, text="Load") 
     load.pack(anchor=W) 
     source = Menubutton(fileMenu.menu, text="Source") 
     source.pack(anchor=W) 
     source.menu = Menu(source, tearoff = 0) 
     self._listi = ["who", "what", "where", "how"] 
     self._buttonList = [] 
     for l in self._listi: 
      c = Checkbutton(master = source.menu, text=l, command=lambda arg0=l: self.test(arg0)) 
      self._buttonList.append([l, c]) 
      c.pack() 
     save = Button(master=fileMenu.menu, text="Save") 
     save.pack(anchor=W) 
     exit = Button(master=fileMenu.menu, text="Exit", command = self.quit) 
     exit.pack() 
     fileMenu['menu'] = fileMenu.menu 
     menuBar.pack() 

    def test(self, arg0): 
     for b in self._buttonList: 
      if arg0 != b[0]: 
       b[1].deselect() 
      elif arg0 == b[0]: 
       b[1].select() 


# create app 
myApp = App() 

# start program 
myApp.mainloop() 
+1

메뉴를 만드는 방법을 알고 있다고 가정 할 때 하위 메뉴를 만드는 것이 특히 어렵지 않습니다. 우리가 시도한 것을 보여 주시고 잘못된 일을 지적 해 주실 수 있습니다. –

+0

오케이. 나는 nonworking 코드의 한 예를 추가했다. 나는 정말로 이것을하는 방법의 예가 필요하고 그것을 찾을 수 없다. –

답변

1

:

다음은 비 작동 코드의 한 예입니다 감사합니다. add_checkbutton 또는 add_radiobutton 또는 add_command 방법을 사용해야합니다. 또한 프레임과 메뉴 버튼에서 메뉴 모음을 만들 필요가 없습니다. 메뉴를 창에 직접 첨부 할 수 있습니다. 또한 체크 버튼이나 라디오 버튼을 프로그래밍 방식으로 선택하거나 선택 해제 할 필요가 없습니다. 즉, tkinter가 처리합니다. 나는 또한 루트 윈도우를 생성하는 코드의 라인을 추가

from Tkinter import * 
class App(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.makeMenu(master) 

    def makeMenu(self, parent): 
     menuBar = Menu(parent) 
     parent.configure(menu=menuBar) 
     fileMenu = Menu(menuBar) 
     sourceMenu = Menu(menuBar) 
     menuBar.add_cascade(label="File", menu=fileMenu) 
     fileMenu.add_command(label="Load") 
     fileMenu.add_cascade(label="Source", menu=sourceMenu) 
     self._listi = ["who","what","where","how"] 
     for l in self._listi: 
      sourceMenu.add_checkbutton(label=l, command=lambda arg0=l: self.test(arg0)) 
     fileMenu.add_command(label="Save") 
     fileMenu.add_command(label="Exit", command=self.quit) 


    def test(self, arg0): 
     print "you clicked on", arg0 


# create app 
root = Tk() 
myApp = App(root) 

# start program 
myApp.mainloop() 

주, 그리고 앱의 생성자에 그 루트 창을 통과 :

나는 설명하기 위해 코드를 수정했습니다.