无法使用 get() 方法从弹出窗口获取数据

Can't use the get() method to get data from a popup

好的,所以我一直在研究这门课程,我正在尝试在允许用户编辑他们的详细信息之前实施登录检查。但是,出于某种原因,我无法使用 get() 方法从弹出窗口的输入框中获取数据。它不会识别输入框,因为它们未在 checkLogin 函数中定义。我不确定如何正确引用条目,因为它们在弹出窗口中。这是我目前拥有的:

import tkinter as tk

def popupmsg(window,msg):
        popup = tk.Tk()
        popup.wm_title("Alert")
        messageLabel = tk.Label(popup, text=msg, font=MEDIUM_FONT)
        messageLabel.grid(row=1, sticky="nsew")
        okayButton = tk.Button(popup, text="Okay", command = popup.destroy)
        okayButton.grid(row=2, sticky="nsew")
        popup.mainloop()

def checkLogin(window):
        username = usernameEntry.get()
        password = passwordEntry.get()
        if username == "USERNAME" and password == "PASSWORD":
            popupmsg(window, "Login Successful")
            usernameEntry.delete(0, "end") #clears username from login
            passwordEntry.delete(0, "end") #clears password from login
        else:
            popupmsg(window, "Invalid Login") #presents error message if login is incorrect

def popupquery(window):
    popup = tk.Tk()
    popup.wm_title("Login Check")

    messageLabel = tk.Label(popup, text="Enter your username and password to edit details.", font=MEDIUM_FONT)
    messageLabel.grid(row=1, sticky="nsew")

    usernameLabel = tk.Label(popup, text="Username: ", font=MEDIUM_FONT)
    usernameLabel.grid(row=2, sticky="nsew")
    usernameVar = tk.StringVar(popup)
    usernameEntry = tk.Entry(popup, textvariable=usernameVar)
    usernameEntry.grid(row=3,column=0)

    passwordLabel = tk.Label(popup, text="Password:", font=MEDIUM_FONT)
    passwordLabel.grid(row=4, sticky="nsew")
    passwordVar = tk.StringVar(popup)
    passwordEntry = tk.Entry(popup, textvariable=passwordVar)
    passwordEntry.grid(row=5,column=0)

    okayButton = tk.Button(popup, text="Okay", command = lambda: checkLogin(window))
    okayButton.grid(row=6, sticky="nsew")
    popup.mainloop()

MEDIUM_FONT = ("Berlin Sans FB", 12)
LARGE_FONT = ("Berlin Sans FB", 16)

window = tk.Tk()

titleLabel = tk.Label(window, text="View Stylist", font=LARGE_FONT, bg="#FFC0CB")
titleLabel.grid(columnspan = 4)

#searches record using entered data
editButton = tk.Button(window, text="Edit Personal Profile",
                        command=lambda:popupquery(window))
editButton.grid(row=2, column=2, sticky="ew")

window.mainloop()

声明为全局变量

def popupquery(window):
    global usernameEntry, passwordEntry
    ------------

那么这个功能也是

def checkLogin(window):
    global usernameEntry, passwordEntry
    -------------

您应该使用 Toplevel 而不是多次调用 Tkmainloop

您的完整代码

import tkinter as tk


 def popupmsg(window,msg):
        popup = tk.Toplevel()
        popup.wm_title("Alert")
        messageLabel = tk.Label(popup, text=msg, font=MEDIUM_FONT)
        messageLabel.grid(row=1, sticky="nsew")
        okayButton = tk.Button(popup, text="Okay", command = popup.destroy)
        okayButton.grid(row=2, sticky="nsew")


def checkLogin(window):

    global usernameEntry, passwordEntry
    username = usernameEntry.get()
    password = passwordEntry.get()
    if username == "USERNAME" and password == "PASSWORD":
       popupmsg(window, "Login Successful")
       usernameEntry.delete(0, "end") #clears username from login
       passwordEntry.delete(0, "end") #clears password from login
    else:
        popupmsg(window, "Invalid Login") #presents error message if login is incorrect


def popupquery(window):
    global usernameEntry, passwordEntry
    popup = tk.Toplevel()
    popup.wm_title("Login Check")

    messageLabel = tk.Label(popup, text="Enter your username and password to edit details.", font=MEDIUM_FONT)
    messageLabel.grid(row=1, sticky="nsew")

    usernameLabel = tk.Label(popup, text="Username: ", font=MEDIUM_FONT)
    usernameLabel.grid(row=2, sticky="nsew")
    usernameVar = tk.StringVar(popup)
    usernameEntry = tk.Entry(popup, textvariable=usernameVar)
    usernameEntry.grid(row=3,column=0)

    passwordLabel = tk.Label(popup, text="Password:", font=MEDIUM_FONT)
    passwordLabel.grid(row=4, sticky="nsew")
    passwordVar = tk.StringVar(popup)
    passwordEntry = tk.Entry(popup, textvariable=passwordVar)
    passwordEntry.grid(row=5,column=0)

    okayButton = tk.Button(popup, text="Okay", command = lambda: checkLogin(window))
    okayButton.grid(row=6, sticky="nsew")



MEDIUM_FONT = ("Berlin Sans FB", 12)
LARGE_FONT = ("Berlin Sans FB", 16)

window = tk.Tk()

titleLabel = tk.Label(window, text="View Stylist", font=LARGE_FONT, 
bg="#FFC0CB")
titleLabel.grid(columnspan = 4)

#searches record using entered data
editButton = tk.Button(window, text="Edit Personal Profile",
                    command=lambda:popupquery(window))
editButton.grid(row=2, column=2, sticky="ew")

window.mainloop()

您迟早需要学习使用 OOP 方法编写 class。

我已将您的代码重组为 class 以说明如何使用 class 属性和 class 方法更简洁、更易于处理。

我在这里删除了不需要的小部件的不必要的变量名。如果您稍后计划 editing/updating 这个小部件,您真的只需要将一个小部件分配给一个变量名。如果小部件是静态的并且不需要更改,那么您可以放弃变量名。

现在所有内容都已移至 class 中,我们不需要使用 global,我们可以稍微清理一下代码。它使阅读和更新更容易。

编写 tkinter GUI 时,您实际上只需要 Tk() 的 1 个实例。不要使用 Tk() 打开新的 windows 你应该使用 Toplevel() 因为这是它的设计目的。

另一个简单的清理是删除 lambda 表达式,因为在这个 class 结构中我们不需要在这里使用 lambda。有时您可能 need/want 在 class 中使用 lambda,但在这种情况下不需要。

最后一个变化。即使您可以在此处使用 textvariable,也没有真正的理由使用它。在这种情况下,它对您没有帮助或伤害,因此您可以将 textvariable 参数排除在外,并在输入字段上简单地使用 get()

阅读下面的代码,如果您有任何问题,请告诉我。

import tkinter as tk


class App(tk.Frame):

    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.MEDIUM_FONT = ("Berlin Sans FB", 12)
        self.LARGE_FONT = ("Berlin Sans FB", 16)
        self.root = parent

        tk.Label(self, text="View Stylist", font=self.LARGE_FONT, bg="#FFC0CB").grid(columnspan = 4)
        tk.Button(self, text="Edit Personal Profile", command=self.popupquery).grid(row=2, column=2, sticky="ew")

    def popupmsg(self, msg):
            popup = tk.Toplevel(self.root)
            popup.title("Alert")
            tk.Label(popup, text=msg, font=self.MEDIUM_FONT).grid(row=1, sticky="nsew")
            tk.Button(popup, text="Okay", command = popup.destroy).grid(row=2, sticky="nsew")

    def checkLogin(self):
            if self.usernameEntry.get() == "USERNAME" and self.passwordEntry.get() == "PASSWORD":
                self.popupmsg("Login Successful")
                self.usernameEntry.delete(0, "end")
                self.passwordEntry.delete(0, "end")
            else:
                self.popupmsg("Invalid Login")

    def popupquery(self):
        popup = tk.Toplevel(self.root)
        popup.title("Login Check")

        tk.Label(popup, text="Enter your username and password to edit details.", font=self.MEDIUM_FONT).grid(row=1, sticky="nsew")
        tk.Label(popup, text="Username: ", font=self.MEDIUM_FONT).grid(row=2, sticky="nsew")
        tk.Label(popup, text="Password:", font=self.MEDIUM_FONT).grid(row=4, sticky="nsew")

        self.usernameEntry = tk.Entry(popup)
        self.usernameEntry.grid(row=3,column=0)
        self.passwordEntry = tk.Entry(popup)
        self.passwordEntry.grid(row=5,column=0)

        tk.Button(popup, text="Okay", command = self.checkLogin).grid(row=6, sticky="nsew")


if __name__ == "__main__":
    root = tk.Tk() 
    App(root).pack()
    tk.mainloop()