python-3.x - Python tkinter:如何使条目值更新变量?
问题描述
这是我丑陋的小 MWE/MCVE。
代码如下。
基本上,我希望self.integer
变量 ( 0
) 在用户在小Entry
框中键入时发生变化。我以为我在官方文档
中看到了一些关于它的信息,但我不确定。我无法理解它。另外,我认为有几种不同的方法可以做到这一点。
from tkinter import *
class Main():
def __init__(self):
self.main = Tk()
#INTEGER
self.integer = 0
#BUTTONS
Button(self.main,text='Quit',command=self.main.destroy).pack()
Button(self.main,text='+',command=self.plus_one).pack()
Button(self.main,text='-',command=self.take_one).pack()
#ENTRY
Entry(self.main,textvariable=self.integer,justify=CENTER,width=4).pack()
#MAINLOOP
mainloop()
def plus_one(self):
self.integer = self.integer + 1
self.entry0.delete(0,END)
self.entry0.insert(0,self.integer)
def take_one(self):
self.integer = self.integer - 1
self.entry0.delete(0,END)
self.entry0.insert(0,self.integer)
Main()
解决方案
而不是让变量直接指向 Integer,您应该使用IntVar()
. 这样做的原因是,当您将 a 设置textvariable
为Entry
Box 时,您需要使用IntVar()
或StringVar()
。这将允许您在输入框中输入内容或更新代码中的 IntVar 的值时更新值。
看看这个修改过的代码示例。我对其进行了一些清理,使其更符合 PEP8 标准。我也将您的更改self.integer
为IntVar()
.
import tkinter as tk
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
#INTEGER
self.integer = tk.IntVar()
self.integer.set(0)
#BUTTONS
tk.Button(self, text='Quit', command=self.destroy).pack()
tk.Button(self, text='+', command=self.plus_one).pack()
tk.Button(self, text='-', command=self.take_one).pack()
#ENTRY
self.entry0 = tk.Entry(self, textvariable=str(self.integer), justify="center", width=4)
self.entry0.pack()
def plus_one(self):
x = self.integer.get() + 1
self.integer.set(x)
def take_one(self):
x = self.integer.get() - 1
self.integer.set(x)
app = Main()
app.mainloop()
要检查是否IntVar()
正在自动更新,无论您如何添加到“条目”框中,您都可以使用打印 的按钮self.integer
以确保其正常工作。
import tkinter as tk
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
#INTEGER
self.integer = tk.IntVar()
self.integer.set(0)
#BUTTONS
tk.Button(self, text='Quit', command=self.destroy).pack()
tk.Button(self, text='+', command=self.plus_one).pack()
tk.Button(self, text='-', command=self.take_one).pack()
tk.Button(self, text="Print IntVar", command=self.print_intvar).pack()
#ENTRY
self.entry0 = tk.Entry(self, textvariable=str(self.integer), justify="center", width=4)
self.entry0.pack()
def plus_one(self):
x = self.integer.get() + 1
self.integer.set(x)
def take_one(self):
x = self.integer.get() - 1
self.integer.set(x)
def print_intvar(self):
print(self.integer.get())
app = Main()
app.mainloop()
推荐阅读
- javascript - 如何使用函数获得数组的平均值?
- swift - Cordova 自定义 URL 方案在 IOS 上不起作用(不支持的 URL)
- javascript - 如果在 Google 脚本中其他
- javascript - 有没有办法在 document.write 中编写和 i/else 语句?
- google-cloud-platform - google云平台的kubernetes引擎镜像授权过程中如何删除添加的attestation
- python - 在没有 Internet 的 Linux 上安装 Python 包和依赖项
- amazon-cloudformation - 遇到不支持的属性 ComparisonOperator
- java - 用于导入 excel 工作表然后将其存储到 servlet 中的 DB 的省时程序
- dataframe - 如何使用pyspark数据框的withColumn动态放置条件。?
- vb.net - Telerik radgridview 分页