2017-04-19 91 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

非常感謝!我會仔細看看的。 –

相關問題