2017-04-19 46 views
-2

这是我为了展示问题而做出的一个简单示例,它是从大型项目中提取的,所以请原谅命名。因此,基本上我有如下所示的GUI:tkinter:当按下按钮时不调用函数

enter image description here

连接按钮和BE \ RP ...按钮属于一个帧(control_container),它是像导航或标签选择,应始终显示出来,并且info按钮属于另一个框架(容器),当你点击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

@HansongLi:没有。那时你可能想使用'lambda'或'functools.partial'。这里重要的是不要记住规则,但要明白实际需要什么。你必须为'command'提供一个_callable_。 http://stackoverflow.com/questions/111234/what-is-a-callable-in-python –

+0

非常感谢!我会仔细看看的。 –

相关问题