首页 > 解决方案 > 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()

标签: python-3.xvariablestkintertkinter-entry

解决方案


而不是让变量直接指向 Integer,您应该使用IntVar(). 这样做的原因是,当您将 a 设置textvariableEntryBox 时,您需要使用IntVar()StringVar()。这将允许您在输入框中输入内容或更新代码中的 IntVar 的值时更新值。

看看这个修改过的代码示例。我对其进行了一些清理,使其更符合 PEP8 标准。我也将您的更改self.integerIntVar().

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

推荐阅读