Python - Tkinter - 来自 StringVar 的标签文本不 display/update
Python - Tkinter - Label text from StringVar does not display/update
我正在尝试将我之前编写的简单命令行程序转换为具有 GUI。在开始向我的 existing/working 代码添加内容之前,我想尝试一下在 Tkinter 中构建 GUI。我终于开始取得进展,让事情按照我想要的方式显示,直到我得到我想让它们的显示文本根据变量的内容而改变的小部件。
根据我在此处和各种文档集中阅读的内容,执行此操作的方法是使用 StringVar
,我曾尝试这样做,但是当我 运行程序,status_msg
标签小部件的文本根本不显示。我尝试在几个地方调用 set() 来更新变量,虽然它似乎更新了变量,但标签根本没有出现在 window 中。最后我尝试添加一个 "Add Key" 按钮调用的函数来强制调用 set 并尝试显示标签,但它仍然不起作用,尽管它确实打印出我对控制台的期望。
我不知道我做错了什么。这是我的代码:
import tkinter as tk
numkeys = 0
keystring = str(numkeys) + " entries ready for parsing"
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.grid()
self.createWidgets()
def createWidgets(self):
self.numkeys = tk.StringVar()
self.numkeys.set(keystring)
api_frame = tk.LabelFrame(self, text="Key Entry", padx = 5, pady = 5)
api_frame.grid(padx = 10, pady = 10)
key1_lbl = tk.Label(api_frame, text = "Entry 1:", anchor = tk.W)
key1_lbl.grid(row = 0, column = 0)
self.key = tk.Entry(api_frame, width = 18)
self.key.grid(row = 0, column = 1)
key2_lbl = tk.Label(api_frame, text="Entry 2:")
key2_lbl.grid(row = 0, column = 2, padx = 5)
self.key2 = tk.Entry(api_frame, width = 45)
self.key2.grid(row = 0, column = 3, padx = 2, columnspan = 3)
status_msg = tk.Label(api_frame, textvariable = self.numkeys.get())
status_msg.grid(row = 1, column = 0, columnspan = 3)
btn_submit = tk.Button(api_frame, text="Add Key", width = 12, command = self.test)
btn_submit.grid(row = 1, column = 4, pady = 5)
btn_start = tk.Button(api_frame, text="Parse Keys", width = 12, command = None)
btn_start.grid(row = 1, column = 5, pady = 5)
#self.numkeys.set(keystring)
def test(self):
self.numkeys.set(keystring)
root.update_idletasks()
print("test function ran")
print(app.numkeys.get())
root = tk.Tk()
app = Application(master=root)
app.master.title('Tk test')
app.mainloop()
替换
textvariable = self.numkeys.get()
来自
textvariable = self.numkeys
我正在尝试将我之前编写的简单命令行程序转换为具有 GUI。在开始向我的 existing/working 代码添加内容之前,我想尝试一下在 Tkinter 中构建 GUI。我终于开始取得进展,让事情按照我想要的方式显示,直到我得到我想让它们的显示文本根据变量的内容而改变的小部件。
根据我在此处和各种文档集中阅读的内容,执行此操作的方法是使用 StringVar
,我曾尝试这样做,但是当我 运行程序,status_msg
标签小部件的文本根本不显示。我尝试在几个地方调用 set() 来更新变量,虽然它似乎更新了变量,但标签根本没有出现在 window 中。最后我尝试添加一个 "Add Key" 按钮调用的函数来强制调用 set 并尝试显示标签,但它仍然不起作用,尽管它确实打印出我对控制台的期望。
我不知道我做错了什么。这是我的代码:
import tkinter as tk
numkeys = 0
keystring = str(numkeys) + " entries ready for parsing"
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.grid()
self.createWidgets()
def createWidgets(self):
self.numkeys = tk.StringVar()
self.numkeys.set(keystring)
api_frame = tk.LabelFrame(self, text="Key Entry", padx = 5, pady = 5)
api_frame.grid(padx = 10, pady = 10)
key1_lbl = tk.Label(api_frame, text = "Entry 1:", anchor = tk.W)
key1_lbl.grid(row = 0, column = 0)
self.key = tk.Entry(api_frame, width = 18)
self.key.grid(row = 0, column = 1)
key2_lbl = tk.Label(api_frame, text="Entry 2:")
key2_lbl.grid(row = 0, column = 2, padx = 5)
self.key2 = tk.Entry(api_frame, width = 45)
self.key2.grid(row = 0, column = 3, padx = 2, columnspan = 3)
status_msg = tk.Label(api_frame, textvariable = self.numkeys.get())
status_msg.grid(row = 1, column = 0, columnspan = 3)
btn_submit = tk.Button(api_frame, text="Add Key", width = 12, command = self.test)
btn_submit.grid(row = 1, column = 4, pady = 5)
btn_start = tk.Button(api_frame, text="Parse Keys", width = 12, command = None)
btn_start.grid(row = 1, column = 5, pady = 5)
#self.numkeys.set(keystring)
def test(self):
self.numkeys.set(keystring)
root.update_idletasks()
print("test function ran")
print(app.numkeys.get())
root = tk.Tk()
app = Application(master=root)
app.master.title('Tk test')
app.mainloop()
替换
textvariable = self.numkeys.get()
来自
textvariable = self.numkeys