python - 如何在 tkinter for python 中保存共享数据?
问题描述
我对使用 Python 的 GUI 世界非常陌生,并试图用多个页面构建我的第一个 GUI,但是从输入框中共享一个变量真的让我陷入了一个循环。我知道代码可能有很多错误,但是现在,我真的只是想更好地了解如何从用户名输入框在页面之间共享变量。
这是与此相关的代码:(分页符只是一些不相关代码的地方)
import tkinter as tk
from tkinter import Tk, Label, Button, StringVar
class Keep(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.shared_data ={
"email": tk.StringVar(),
"password": tk.StringVar()
}
# Skipping some code to get to the good stuff
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
# LABELS, ENTRIES, AND BUTTONS
# page break
self.entry1 = tk.Entry(self, textvariable=self.controller.shared_data["email"])
entry2 = tk.Entry(self, show = '*')
button1 = tk.Button(text="Submit", command=lambda: [controller.show_frame("PageTwo"), self.retrieve()])
# page break
def retrieve(self):
self.email = self.controller.shared_data["email"].get()
self.controller.email = self.email
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.email = self.controller.shared_data["email"].get()
label1 = tk.Label(self, text="Welcome, {}".format(self.email))
if __name__ == "__main__":
keep = Keep()
keep.mainloop()
我知道检索功能看起来很时髦,可能根本不正确,但我已经研究这个特定问题大约一个星期了,它让我陷入了一些野兔洞。
最终目标是为了label1
显示,“欢迎,(插入输入的pageTwo
电子邮件)”。entry1
startPage
我认为我的问题在于pageTwo
从 检索空字符串shared_data
,但我不明白为什么会这样。
任何帮助都非常感谢!
解决方案
我猜问题是因为框架是在你运行时创建的Keep.__init__
,而不是在你运行时创建的show_frame()
,所以PageTwo.__init__()
是在开始时执行的,而文本Welcome...
是在开始时创建的——甚至在你看到之前StartPage
。
您应该在其中创建空标签并在其他方法(即。)中__init__
创建文本,如果所有类都将具有>Welcome...
update_widgets()
show_frame()
show_frame()
update_widgets()
最小的工作代码:
import tkinter as tk
class Keep(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.shared_data ={
"email": tk.StringVar(),
"password": tk.StringVar()
}
self.frames = {
'StartPage': StartPage(self, self),
'PageTwo': PageTwo(self, self),
}
self.current_frame = None
self.show_frame('StartPage')
def show_frame(self, name):
if self.current_frame:
self.current_frame.forget()
self.current_frame = self.frames[name]
self.current_frame.pack()
self.current_frame.update_widgets() # <-- update data in widgets
class StartPage(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
self.controller = controller
self.entry1 = tk.Entry(self, textvariable=self.controller.shared_data["email"])
self.entry1.pack()
entry2 = tk.Entry(self, show='*')
entry2.pack()
button = tk.Button(self, text="Submit", command=lambda:controller.show_frame("PageTwo"))
button.pack()
def update_widgets(self):
pass
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
self.controller = controller
self.label = tk.Label(self, text="") # <-- create empty label
self.label.pack()
def update_widgets(self):
self.label["text"] = "Welcome, {}".format(self.controller.shared_data["email"].get()) # <-- update text in label
if __name__ == "__main__":
keep = Keep()
keep.mainloop()
推荐阅读
- python - 使用 generate.py StyleGAN 2 ADA 无法识别的参数
- azure - Add-AzWebAppAccessRestrictionRule 在不能为 null 的参数“源”上失败(尝试使用 -ServiceTag)
- amazon-web-services - 如何计算来自 Cassandra 的 RCU 和 WCU 以进行 AWS Keyspace 成本估算?
- javascript - 是什么原因导致无法在 keyup 上更新数组
- terraform - Terragrunt 没有从导入的源获得输出
- c - Xlib,如何使应用程序直接在根窗口上绘制?
- verilog - 如何随机化 100 个变量中的 1 个
- plpgsql - 如何查看在函数中运行的语句(Greenplum)
- python - 如何在python中将json列表转换为数据框
- r - 在 geofacet 中从美国网格中删除阿拉斯加和夏威夷