无法使用 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
而不是多次调用 Tk
和 mainloop
您的完整代码
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()
好的,所以我一直在研究这门课程,我正在尝试在允许用户编辑他们的详细信息之前实施登录检查。但是,出于某种原因,我无法使用 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
而不是多次调用 Tk
和 mainloop
您的完整代码
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()