在 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()

上面创建了labelentrybuttonbutton 有一个 command 调用 class App 中的 def 并将 label 的值更新为包含在其中的文本entry.

这一切都非常顺利和干净,更重要的是(在我看来)将来更容易阅读和更新。