在 Python 3.5.2 中使用 tkinter 在按钮推送时从输入字段更新标签
Updating a label from an entry field on button push with tkinter in Python 3.5.2
我正在尝试创建一个带有行标签、输入字段、当前值标签和 "Update Value" 按钮的 window。
这是一个例子:
这就是我目前所拥有的。我可以获得输入的值以打印到控制台,但我似乎无法弄清楚如何通过按下按钮来获取输入的值并更改 currentValue 标签以反映该值:
from tkinter import*
main=Tk()
#StringVar for currentValue in R0C2
currentValue = StringVar(main, "0")
#Called by the setValues button, looks for content in the entry box and updates the "current" label
def setValues():
content = entry.get()
print(content)
#This kills the program
def exitProgram():
exit()
#Title and window size
main.title("Title")
main.geometry("350x200")
#Descriptions on the far left
Label(main, text="Duration (min): ").grid(row=0, column=0)
#Entry boxes for values amidship
entry=Entry(main, width=10)
entry.grid(row=0, column=1)
#Displays what the value is currently set to.
currentValue = Label(textvariable=currentValue)
currentValue.grid(row=0,column=2)
#Takes any inputted values and sets them in the "Current" column using def setValues
setValues=Button(text='Set Values',width=30,command=setValues)
setValues.grid(row=9, column=0, columnspan=2)
#Red button to end program
exitButton=Button(main, text='Exit Program',fg='white',bg='red',width=30, height=1,command=exitProgram)
exitButton.grid(row=20, column = 0, columnspan=2)
main.mainloop()
您的代码有几个问题。
首先,您要用 setValues
按钮小部件覆盖 setValues
函数,同样,您要用 currentValue
标签覆盖 currentValue
StringVar。
要设置 StringVar,您可以使用其 .set
方法。
不要在脚本中使用普通的 exit
,那只是为了在交互式解释器会话中使用,正确的退出函数是 sys.exit
。但是,在 Tkinter 程序中,您可以只调用根 window.
的 .destroy
方法
这是您的代码的修复版本。
import tkinter as tk
main = tk.Tk()
#StringVar for currentValue in R0C2
currentValue = tk.StringVar(main, "0")
#Called by the setValues button, looks for content in the entry box and updates the "current" label
def setValues():
content = entry.get()
print(content)
currentValue.set(content)
#This kills the program
def exitProgram():
main.destroy()
#Title and window size
main.title("Title")
main.geometry("350x200")
#Descriptions on the far left
tk.Label(main, text="Duration (min): ").grid(row=0, column=0)
#Entry boxes for values amidship
entry = tk.Entry(main, width=10)
entry.grid(row=0, column=1)
#Displays what the value is currently set to.
currentValueLabel = tk.Label(textvariable=currentValue)
currentValueLabel.grid(row=0,column=2)
#Takes any inputted values and sets them in the "Current" column using def setValues
setValuesButton = tk.Button(text='Set Values',width=30,command=setValues)
setValuesButton.grid(row=9, column=0, columnspan=2)
#Red button to end program
exitButton = tk.Button(main, text='Exit Program',fg='white',bg='red',width=30, height=1,command=exitProgram)
exitButton.grid(row=20, column = 0, columnspan=2)
main.mainloop()
顺便说一句,避免 "star" 导入是个好主意。执行 from tkinter import *
会将 130 个名称转储到您的名称空间中,这是不必要的,并且会产生名称冲突的可能性,尤其是当您从多个模块进行星形导入时。它还使代码的可读性降低,因为 reader 记住了您定义的名称以及来自导入模块的名称。
根据您的代码,您正在设置“currentValue”,它是一个 StringVar:
#StringVar for currentValue in R0C2
currentValue = StringVar(main, "0")
到代码中更下方的对象 Label。你不能这样做!
#Displays what the value is currently set to.
currentValue = Label(textvariable=currentValue) ** this line is wrong
currentValue.grid(row=0,column=2)
您应该将标签命名为不同的名称,例如:
#Displays what the value is currently set to.
lblCurrentValue = Label(textvariable=currentValue)
lblCurrentValue.grid(row=0,column=2)
然后在您的 "setValues" 方法中,您应该使用 'StringVar.set(value) 来更新标签,如下所示:
def setValues():
content = entry.get()
currentValue.set(entry.get())------------------Here I set the value to the entry box value
print(content)
我倾向于避免使用 stringVar 而只使用:
Label.config(text='*label's text*')
如果您需要更多帮助,我可以 post 您提供我的解决方案,但首先尝试解决它,因为这是最好的学习方式。我的建议是确保您使用正确的命名约定。在 tkinter 中,我倾向于在小部件之前使用 lbl...、entryBox... 等,所以我知道它们是什么,而不是将它们与变量混淆。
在我看来,最简单的方法是使用面向对象的方法。这样你就可以声明一个 button
和一个 command
调用一个运行 self.label.configure(text=self.entry.get())
.
的 def
这可以在下面看到:
import tkinter as tk
class App:
def __init__(self, master):
self.master = master
self.label = tk.Label(self.master)
self.entry = tk.Entry(self.master)
self.button = tk.Button(self.master, text="Ok", command=self.command)
self.label.pack()
self.entry.pack()
self.button.pack()
def command(self):
self.label.configure(text=self.entry.get())
root = tk.Tk()
app = App(root)
root.mainloop()
上面创建了label
、entry
和button
。 button
有一个 command
调用 class
App
中的 def
并将 label
的值更新为包含在其中的文本entry
.
这一切都非常顺利和干净,更重要的是(在我看来)将来更容易阅读和更新。
我正在尝试创建一个带有行标签、输入字段、当前值标签和 "Update Value" 按钮的 window。
这是一个例子:
这就是我目前所拥有的。我可以获得输入的值以打印到控制台,但我似乎无法弄清楚如何通过按下按钮来获取输入的值并更改 currentValue 标签以反映该值:
from tkinter import*
main=Tk()
#StringVar for currentValue in R0C2
currentValue = StringVar(main, "0")
#Called by the setValues button, looks for content in the entry box and updates the "current" label
def setValues():
content = entry.get()
print(content)
#This kills the program
def exitProgram():
exit()
#Title and window size
main.title("Title")
main.geometry("350x200")
#Descriptions on the far left
Label(main, text="Duration (min): ").grid(row=0, column=0)
#Entry boxes for values amidship
entry=Entry(main, width=10)
entry.grid(row=0, column=1)
#Displays what the value is currently set to.
currentValue = Label(textvariable=currentValue)
currentValue.grid(row=0,column=2)
#Takes any inputted values and sets them in the "Current" column using def setValues
setValues=Button(text='Set Values',width=30,command=setValues)
setValues.grid(row=9, column=0, columnspan=2)
#Red button to end program
exitButton=Button(main, text='Exit Program',fg='white',bg='red',width=30, height=1,command=exitProgram)
exitButton.grid(row=20, column = 0, columnspan=2)
main.mainloop()
您的代码有几个问题。
首先,您要用 setValues
按钮小部件覆盖 setValues
函数,同样,您要用 currentValue
标签覆盖 currentValue
StringVar。
要设置 StringVar,您可以使用其 .set
方法。
不要在脚本中使用普通的 exit
,那只是为了在交互式解释器会话中使用,正确的退出函数是 sys.exit
。但是,在 Tkinter 程序中,您可以只调用根 window.
.destroy
方法
这是您的代码的修复版本。
import tkinter as tk
main = tk.Tk()
#StringVar for currentValue in R0C2
currentValue = tk.StringVar(main, "0")
#Called by the setValues button, looks for content in the entry box and updates the "current" label
def setValues():
content = entry.get()
print(content)
currentValue.set(content)
#This kills the program
def exitProgram():
main.destroy()
#Title and window size
main.title("Title")
main.geometry("350x200")
#Descriptions on the far left
tk.Label(main, text="Duration (min): ").grid(row=0, column=0)
#Entry boxes for values amidship
entry = tk.Entry(main, width=10)
entry.grid(row=0, column=1)
#Displays what the value is currently set to.
currentValueLabel = tk.Label(textvariable=currentValue)
currentValueLabel.grid(row=0,column=2)
#Takes any inputted values and sets them in the "Current" column using def setValues
setValuesButton = tk.Button(text='Set Values',width=30,command=setValues)
setValuesButton.grid(row=9, column=0, columnspan=2)
#Red button to end program
exitButton = tk.Button(main, text='Exit Program',fg='white',bg='red',width=30, height=1,command=exitProgram)
exitButton.grid(row=20, column = 0, columnspan=2)
main.mainloop()
顺便说一句,避免 "star" 导入是个好主意。执行 from tkinter import *
会将 130 个名称转储到您的名称空间中,这是不必要的,并且会产生名称冲突的可能性,尤其是当您从多个模块进行星形导入时。它还使代码的可读性降低,因为 reader 记住了您定义的名称以及来自导入模块的名称。
根据您的代码,您正在设置“currentValue”,它是一个 StringVar:
#StringVar for currentValue in R0C2
currentValue = StringVar(main, "0")
到代码中更下方的对象 Label。你不能这样做!
#Displays what the value is currently set to.
currentValue = Label(textvariable=currentValue) ** this line is wrong
currentValue.grid(row=0,column=2)
您应该将标签命名为不同的名称,例如:
#Displays what the value is currently set to.
lblCurrentValue = Label(textvariable=currentValue)
lblCurrentValue.grid(row=0,column=2)
然后在您的 "setValues" 方法中,您应该使用 'StringVar.set(value) 来更新标签,如下所示:
def setValues():
content = entry.get()
currentValue.set(entry.get())------------------Here I set the value to the entry box value
print(content)
我倾向于避免使用 stringVar 而只使用:
Label.config(text='*label's text*')
如果您需要更多帮助,我可以 post 您提供我的解决方案,但首先尝试解决它,因为这是最好的学习方式。我的建议是确保您使用正确的命名约定。在 tkinter 中,我倾向于在小部件之前使用 lbl...、entryBox... 等,所以我知道它们是什么,而不是将它们与变量混淆。
在我看来,最简单的方法是使用面向对象的方法。这样你就可以声明一个 button
和一个 command
调用一个运行 self.label.configure(text=self.entry.get())
.
def
这可以在下面看到:
import tkinter as tk
class App:
def __init__(self, master):
self.master = master
self.label = tk.Label(self.master)
self.entry = tk.Entry(self.master)
self.button = tk.Button(self.master, text="Ok", command=self.command)
self.label.pack()
self.entry.pack()
self.button.pack()
def command(self):
self.label.configure(text=self.entry.get())
root = tk.Tk()
app = App(root)
root.mainloop()
上面创建了label
、entry
和button
。 button
有一个 command
调用 class
App
中的 def
并将 label
的值更新为包含在其中的文本entry
.
这一切都非常顺利和干净,更重要的是(在我看来)将来更容易阅读和更新。