Python面向对象的Tkinter - 调用函数错误

时间:2015-12-11 20:46:43

标签: python oop python-3.x tkinter tk

我在登录框上有一个登录按钮,我希望登录按钮只带我到AdminHome框架,如果"有效"在用户名条目中输入。我无法让show_frame()函数在validate()函数(位于Login类中)中运行。

我收到错误:

NameError: global name 'show_frame' is not defined

我如何克服此错误并使其运行?

import tkinter as tk
from tkinter import ttk

class Program(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 (Login, AdminHome):

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

        self.show_frame(Login)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()


class Login(tk.Frame):

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

        innerFrame = tk.Frame(self)
        innerFrame.place(relx=.5, rely=.5, anchor="c")        

        pagename = tk.Label(innerFrame, text = "iDea Academy Progress Tracker Login")
        pagename.grid(row=0, columnspan=5, sticky="W"+"E")


        username = tk.Label(innerFrame, text="Username: ")
        username.grid(row=1, columnspan=2, sticky="W")

        self.user = ttk.Entry(innerFrame, text ="", width=45)
        self.user.grid(row=1, column=2 ,columnspan=3, sticky="w")


        password = tk.Label(innerFrame, text="Password: ")
        password.grid(row=2, columnspan=2, sticky="W")

        self.passentry = ttk.Entry(innerFrame, text ="", width=45, show="*")
        self.passentry.grid(row=2, column=2 ,columnspan=3, sticky="W")


        login = ttk.Button(innerFrame, text = "Login", command = self.validate)
        login.grid(row=3, columnspan=5, sticky="W"+"E")

    def validate(self):
        if self.user.get()=="valid":
            show_frame(AdminHome)

class AdminHome(tk.Frame):

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

        fetch = ttk.Button(self, text = "Fetch Data", command = lambda: controller.show_frame(AdminHome))
        fetch.grid(row=2, columnspan=6, sticky="W"+"E")



app = Program()
app.state('zoomed')
app.mainloop()

1 个答案:

答案 0 :(得分:0)

以下是我的方法:我将在您的登录框架中删除validate方法,并单独定义一个验证函数。这看起来像这样:

def validate(user):
    global app
    print(user)
    if user=="valid":
        app.show_frame(AdminHome)

然后,在登录按钮的命令中,只需将其更改为:lambda: validate(self.user.get())