我可以在方法中使用lambda按钮命令吗?

时间:2016-01-11 19:29:28

标签: python class methods lambda tkinter

我已经在python中编写了很短的时间,所以不能完全理解语言的逻辑,特别是在使用Tkinter时。我目前正在研究我在登录页面专门开发的系统的导航系统。以下是我的问题代码:

class Application(Tk.Tk):

    def __init__(self, *args, **kwargs):
        Tk.Tk.__init__(self, *args, **kwargs)
        container = Tk.Frame(self)
        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 (createLogin, createHome, createViewer, createAnalyse):

            frame = F(container, self)

            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(createLogin)

    def show_frame(self, cont):

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

    def connectToDataBase(self):
        cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb,      *.accdb)};DBQ=C:\Users\Public\dbsDetectorBookingSystem.accdb')
        cursor = cnxn.cursor()

        cursor.execute("SELECT * FROM tblUsers")
        userRows = cursor.fetchall

        cursor.execute("SELECT * FROM tblRuns")
        runsRows = cursor.fetchall



class createLogin(Tk.Frame):

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

        topFrame= Tk.Frame(self)
        topFrame.pack(side="top")

        leftFrame = Tk.Frame(topFrame)
        leftFrame.pack(side="left")

        nameLabel = Tk.Label(leftFrame, text = "Username")
        nameLabel.pack(side="top", padx = 5, pady = 10)

        passwordLabel = Tk.Label(leftFrame, text = "Password")
        passwordLabel.pack(side="top", padx = 5, pady = 10)

        rightFrame = Tk.Frame(topFrame)
        rightFrame.pack(side="left")

        nameText = Tk.Text(rightFrame, height=1, width = 30)
        nameText.pack(side="top", padx = 5, pady = 10)

        passwordText = Tk.Text(rightFrame, height=1, width = 30)
        passwordText.pack(side="top", padx = 5, pady = 10)

        botFrame = Tk.Frame(self)
        botFrame.pack(side="top")

        Login = Tk.Button(botFrame, text="Login")
        Login["command"] = lambda: self.checkLogin()
        Login.pack(side="left", padx = 5, pady = 10)

我想要做的是让登录按钮调用一个方法,该方法可以使用读入数据库中的用户名和密码验证文本框,如果它们是正确的,那么应该调用'show_frame'方法。我可以实现验证但是每当我创建一个尝试调用'show_frame'的方法时,我必须创建一个远非理想的应用程序类的新实例,我真正想做的是触发该方法,传递'createHome '在Application类的当前实例中。

对此有任何帮助将非常感谢抱歉成为这样的新手。

1 个答案:

答案 0 :(得分:0)

您的createLogin课程已经引用了主要应用程序,因此我不明白为什么您认为必须创建应用程序类的新实例"。

我认为您需要做的就是保存controller的实例并使用它来调用show_frame方法。

class createLogin(Tk.Frame):

    def __init__(self, parent, controller):
        Tk.Frame.__init__(self,parent)
        self.controller = controller
        ...
        Login = Tk.Button(botFrame, text="Login", command=self.checkLogin)
        ...
    def checkLogin(self):
        ...
        if correct_password:
            self.controller.show_frame(createHome)