Python Tkinter:如何使Entry值更新变量?

时间:2018-07-17 09:10:18

标签: python-3.x variables tkinter tkinter-entry

这是我丑陋的MWE / MCVE。
代码如下。


enter image description here


基本上,我希望用户在小的self.integer框中键入内容时,更改0变量(Entry)。
我以为我在official documentation中看到了一些相关信息,但不确定。我对此不太了解。另外,我认为有几种不同的实现方法。


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

3 个答案:

答案 0 :(得分:1)

应该使用IntVar()而不是直接指向Integer的变量。这样做的原因是,当您将textvariable设置为Entry框时,您需要使用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()

答案 1 :(得分:0)

我向Mike解决方案添加了绑定,因为除非您按+或-按钮,否则您的IntVar不会更改。如果仅使用按钮,那并不重要,但是如果调用intern方法来获取IntVar值,那将很重要。

name

答案 2 :(得分:-1)

这是一个最小的工作示例。
我所做的更改越少越好。

  • 对代码的所有更改均已 italicized
  • 与该问题直接相关的代码为 bold
  • 遗漏是 #commented & italicized
  • 新代码都是 italicized & bold
from tkinter import *

class Main():
    def __init__(self):
        self.main = Tk()

        #INTEGER
        #self.integer = 0
        self.integer = IntVar(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.set(self.integer.get()+1)
        #self.entry0.delete(0,END)
        #self.entry0.insert(0,self.integer)

    def take_one(self):
        self.integer.set(self.integer.get()-1)
        #self.entry0.delete(0,END)
        #self.entry0.insert(0,self.integer)

Main()

enter image description here