2017-04-19 5 views
-2

이것은 문제를 보여주기 위해 만든 최소한의 예제이며 큰 프로젝트에서 추출되었습니다. 따라서 명명을 용서하십시오. 그래서 기본적으로 나는이처럼 보이는 GUI가 :tkinter : 버튼을 눌렀을 때 함수가 호출되지 않습니다.

enter image description here

연결 버튼을하고 \ RP BE ... 버튼은 항상해야 네비게이터 또는 탭을 선택처럼 프레임 (control_container)에 속하는 표시하고 정보 버튼은 BE \ RP ... 버튼을 클릭하면 해당 프레임 클래스로 변경해야하는 다른 프레임 (컨테이너)에 속합니다. 저를 혼란스럽게하는 것은 연결 버튼을 클릭 할 때 함수 연결을 호출하고 인쇄를해야한다는 것입니다. 그러나 작동하지 않습니다. 클릭하면 아무 일도 일어나지 않습니다. 그러나 프로그램을 삭제하면 불평 할 것이기 때문에 프로그램이 연결 함수를 인식한다는 것을 알고 있습니다. 대조적으로, StartPage에서 정보를 클릭하면 잘 작동하고 인쇄됩니다. 이것은 나에게 정말로 이상합니다.

import tkinter as tk 
from tkinter import ttk 
from tkinter import * 



class emcAutoApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 


     self.control_container = tk.Frame(self) 
     self.control_container.pack(side="top", fill="both", expand = True) 


     container = tk.Frame(self, width=768, height=576, bg="") 
     container.pack(side="top", fill="both", expand = True) 
     container.grid_rowconfigure(0, weight=1)  
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, BE, RP, PreScan, RSE): 
      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row=0, column = 0, sticky='nsew') 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 

     frame = self.frames[cont] 
     frame.tkraise() 

    def get_page(self, page_class): 
     return self.frames[page_class] 


class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 

     self.frame_controller = controller 

     #control frame starts here 
     control_frame = ttk.Frame(self.frame_controller.control_container) 
     control_frame.pack(side='top') 

     chamber_frame = Frame(control_frame, 
          borderwidth=5, 
          relief=RIDGE, 
          width=200 
         ) 
     chamber_frame.pack(side=TOP, expand=YES, fill=X) 

     chamber_frame_1 = Frame(chamber_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     chamber_frame_1.pack(side=LEFT, expand=YES, fill=X) 

     chamber_frame_2 = Frame(chamber_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     chamber_frame_2.pack(side=LEFT, expand=YES, fill=X) 


     connect_button = ttk.Button(chamber_frame_2, text="connect", command=lambda: self.connect) 
     connect_button.pack() 

     tab_frame = Frame(control_frame, 
          borderwidth=5, 
          relief=RIDGE, 
          width=500 
         ) 
     tab_frame.pack(side=TOP, expand=YES, fill=X) 

     tab_frame_1 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_1.pack(side=LEFT, expand=YES, fill=X) 

     tab_frame_2 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_2.pack(side=LEFT, expand=YES, fill=X) 

     tab_frame_3 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_3.pack(side=LEFT, expand=YES, fill=X) 

     tab_frame_4 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_4.pack(side=LEFT, expand=YES, fill=X) 

     BE_button = ttk.Button(tab_frame_1, text="BE", 
          command=lambda: self.frame_controller.show_frame(BE)) 
     BE_button.pack() 

     RP_button = ttk.Button(tab_frame_2, text="RP", 
          command=lambda: self.frame_controller.show_frame(RP)) 
     RP_button.pack() 

     PreScan_button = ttk.Button(tab_frame_3, text="PreScan", 
          command=lambda: self.frame_controller.show_frame(PreScan)) 
     PreScan_button.pack() 

     RSE_button = ttk.Button(tab_frame_4, text="RSE", 
          command=lambda: self.frame_controller.show_frame(RSE)) 
     RSE_button.pack() 


     infobutton = ttk.Button(self, text = "info", command = self.info) 
     infobutton.pack() 


    def info(self): 
     print("info") 

    def connect(self): 
     print("connected") 

class BE(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 

class RP(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 

class PreScan(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 

class RSE(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 


if __name__ == "__main__": 

    #=== GUI ===# 
    LARGE_FONT = ("Verdana", 12) 
    NORM_FRONT = ("Verdana", 10) 

    app = emcAutoApp() 
    app.mainloop() 
+0

예제를 작게 만드십시오. 버튼 작업을하지 않는 것과 관련하여 많은 코드가 있습니다. [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve) –

+0

아마도 이것은 : command = lambda : self.connect' .... 이것은 connect를 호출하지 않습니다. . 아마도'command = self.connect'가 할 것입니다. 또는 매개 변수를 추가하려는 경우'command = lambda : self.connect ('other stuff') '를 선택하십시오. – tdelaney

답변

1

lambda: self.connect 연결하지 않습니다. 이 경우에는 lambda이 필요 없으며 함수를 직접 참조하면됩니다. 일반적으로 버튼은 항상 사용하기보다는 함수에 직접 연결해야합니다. lambda

connect_button = ttk.Button(..., command=self.connect) 
+0

감사합니다. 후속 조치, 버튼을 사용하여 인수가있는 함수를 호출하면 command = self.connect (arg1, arg2)가 작동합니까? –

+0

@ 한송이 : 아니오. 그것은'lambda' 또는'functools.partial'을 사용하고자 할 때입니다. 여기서 중요한 것은 규칙을 외우는 것이 아니라 실제로 필요한 것을 이해하는 것입니다. 'command'에 대해 _callable_를 제공해야합니다. http://stackoverflow.com/questions/111234/what-is-a-callable-in-python –

+0

감사합니다. 나는 그것을 조사 할 것이다. –

관련 문제