tkinter:按下按钮时未调用的函数

时间:2017-04-19 22:42:07

标签: python tkinter

这是我用来显示问题的最小例子,它是从大型项目中提取的,所以请原谅命名。所以基本上我有一个看起来像这样的GUI:

enter image description here

连接按钮和BE \ RP ...按钮属于一个框架(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()

1 个答案:

答案 0 :(得分:1)

lambda: self.connect不会调用connect。在这种情况下,不需要lambda,只需直接引用该函数即可。作为一般经验法则,按钮应始终直接与函数绑定,而不是使用lambda

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