【问题标题】:Tkinter Intvar updates only once, does not show in entryTkinter Intvar 仅更新一次,不显示在条目中
【发布时间】:2021-08-06 19:28:33
【问题描述】:

我正在构建一个 Tkinter 应用程序,用户可以在其中扫描二维码,添加一些数据并生成要打印的标签。

我目前正在构建创建用户输入表单的函数,但遇到了问题。我有一个创建 6 个按钮和 3 个条目的功能。按钮应增加或减少条目中的值。所有 3 个条目的默认值都是 0。

问题是,按钮只将值设置为 1 或 -1,而条目本身并没有得到更新。

我错过了什么?这是我第一次使用 Tkinter 编程,我真的需要一些帮助......

class MainDialog:
    def __init__(self, master):
        self.master = master
        self.frame = Frame(self.master)
        self.button1 = Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
        self.int_e = ['box', 'bag', 'dry']
        self.build_items()
        self.frame.pack()
    def build_items(self):
        for i in range(len(self.int_e)):
            self.b_inc = Button(self.frame, text='+', width=2, bg='white', relief=GROOVE, command=lambda : self.qty(i, '+'))  
            self.b_dec = Button(self.frame, text='-', width=2, bg='white', relief=GROOVE, command=lambda : self.qty(i, '-'))        
            self.e_qty = Entry(self.frame, width=4, textvariable=i)
            self.b_inc.grid(row=i, column=0, pady=10)
            self.e_qty.grid(row=i, column=1, pady=10)
            self.b_dec.grid(row=i, column=2, pady=10)
    def new_window(self):
        self.newWindow = Toplevel(self.master)
        self.app = QRDialog(self.newWindow)
        
    def qty(self, variable:IntVar, method:str) -> None:
        item = variable.get()
        if method == "+":
            item += 1
        elif method == "-":
            item -= 1
        else:
            print("Error: Invalid method given")
        variable.set(item) # Tell tkinter that we want to change its value

【问题讨论】:

  • 现在您正在从IntVar 中获取值,将其更改并打印出来。你永远不会告诉tkinter你改变了那个值。
  • 两个问题。 №.1) item =+ 1 应该是 item += 1 以便将一个添加到 item。 №.2) 更新item 的值后,您需要调用IntVarset() 方法来更新它——但是您不能这样做,因为由于item = item.get(),它不能再被引用你一开始就这样做了。

标签: python tkinter


【解决方案1】:

试试这个:

def qty(self, variable:IntVar, method:str) -> None:
    item = variable.get()
    if method == "+":
        item += 1
    elif method == "-":
        item -= 1
    else:
        print("Error: Invalid method given")
    variable.set(item) # Tell tkinter that we want to change its value

我使用<IntVar>.set(<new value>) 设置新值。 self.master.update() 也不会像你认为的那样做。看tkinter的非官方文档here

您的代码中还有语法错误。如果要将变量加 1 并将结果存储在同一个变量中,则应使用 item += 1 而不是 item =+ 1-= 也是如此。

--

编辑

我刚刚注意到您的代码中还有一些其他问题,例如:

  • textvariable 设置为普通的python int
  • 不在lambda 中使用var=var,如下所示:lambda var=var: ...

但这是你的代码修复:

import tkinter as tk


class MainDialog:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)
        self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
        self.int_e = ['box', 'bag', 'dry']
        self.build_items()
        self.frame.pack()
    def build_items(self):
        for i in range(len(self.int_e)):
            var = tk.IntVar()
            self.b_inc = tk.Button(self.frame, text='+', width=2, bg='white', relief=tk.GROOVE, command=lambda var=var: self.qty(var, '+'))  
            self.b_dec = tk.Button(self.frame, text='-', width=2, bg='white', relief=tk.GROOVE, command=lambda var=var: self.qty(var, '-'))        
            self.e_qty = tk.Entry(self.frame, width=4, textvariable=var)
            self.b_inc.grid(row=i, column=0, pady=10)
            self.e_qty.grid(row=i, column=1, pady=10)
            self.b_dec.grid(row=i, column=2, pady=10)
    def new_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.app = QRDialog(self.newWindow)
        
    def qty(self, variable:tk.IntVar, method:str) -> None:
        item = variable.get()
        if method == "+":
            item += 1
        elif method == "-":
            item -= 1
        else:
            print("Error: Invalid method given")
        variable.set(item) # Tell tkinter that we want to change its value


root = tk.Tk()
MainDialog(root)
root.mainloop()

【讨论】:

  • 感谢您的回复,我编辑了我的代码,但现在它返回 AttributeError: 'int' object has no attribute 'get'
  • @nvsch 你能用新代码+回溯编辑问题中的代码吗?还可以尝试在该函数的开头添加print(variable)。它打印出什么? IntVar 对象或普通 python int
  • 您可能还想提及您将item =+1 更改为item += 1。这对 OP 来说可能并不明显。
  • @BryanOakley 好的,我认为这只是一个错字。由于 OP 的代码甚至不会编译/运行。鉴于 OP 说 按钮仅将值设置为 1 或 -1,代码正在运行并正在打印该值。
  • item =+ 1 不是语法错误,顺便说一句,它只是意味着item = +1
【解决方案2】:

此代码对我有用,感谢您为我指明正确的方向 :)

编辑:

改用@TheLizzard 他的版本。看起来比我自己的代码更干净:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多