首页 > 解决方案 > Tkinter IntVar 不工作

问题描述

我有一个大型机类,然后是一个“inforow”类,它逐行填充帧上的信息,但 StringVar 和 Intvar 似乎不起作用。它们被设置为打印输出显示,但复选按钮不反映它们被设置的值。我制作了一个更简单的版本,突出了这两个文件中的问题。

我在 win32 上使用'Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)]

当我运行 mainframe.py 时,所有的复选按钮都是空白的,但我希望它们是设置和未设置的混合。

大型机.py

from Tkinter import *
import ttk
import inforow

testinfo = {'ITEM 1': {'one':1, 'two':0, 'three':1}
    , 'ITEM 2': {'one':0, 'two':1, 'three':0}}

class MainFrame(Frame):

    def __init__(self, parent=None, **options):
        Frame.__init__(self, parent, **options)
        self.pack(expand=YES, fill=BOTH)
        self.addHeader()
        self.addInfo(testinfo)

    def addHeader(self):
        Label(self, text="Item").grid(row=0,column=0)
        Label(self, text="one").grid(row=0,column=1)
        Label(self, text="two").grid(row=0,column=2)
        Label(self, text="three").grid(row=0,column=3)

    def addInfo(self, info):
        row = 1
        for item in info:
            inforow.InfoRow(self, row, item, info[item])
            row += 1

if __name__ == "__main__": 
    root = Tk()
    MainFrame(root)
    root.mainloop()

和 inforow.py

from Tkinter import *
import ttk

class InfoRow():

    def __init__(self, root, row, item, values):
        self.chkUsedVar1 = IntVar()
        self.chkUsedVar1.set(values["one"])
        self.chkUsedVar2 = IntVar()
        self.chkUsedVar2.set(values["two"])
        self.chkUsedVar3 = IntVar()
        self.chkUsedVar3.set(values["three"])


        self.skillLabel = Label(root, width=10, text=item, anchor="w")
        self.skillLabel.grid(row=row,column=0,sticky=W)

        self.usedChkButton1 = Checkbutton(root, text='Used1', variable=self.chkUsedVar1)
        self.usedChkButton1.grid(row=row,column=1)

        self.usedChkButton2 = Checkbutton(root, text='Used2', variable=self.chkUsedVar2)
        self.usedChkButton2.grid(row=row,column=2)

        self.usedChkButton3 = Checkbutton(root, text='Used3', variable=self.chkUsedVar3)
        self.usedChkButton3.grid(row=row,column=3)
        print 'Row ' + item
        print self.chkUsedVar1.get()
        print self.chkUsedVar2.get()
        print self.chkUsedVar3.get()
        print 

标签: pythontkinter

解决方案


IntVar的 s 仅由您的InfoRow类的实例引用-并且您不保留对它的任何引用,因此所有这些都会立即被垃圾收集。(将 var 传递给Checkbutton()实际上并不存储对 var 的引用,只是其自动生成的名称 -PY_VAR0或其他任何内容。)

如果您完成了这个程序,您显然需要将InfoRows 存储在某个地方,以便您可以检索 var 值 - 这足以修复 Checkbuttons。


推荐阅读