python - 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
解决方案
您IntVar
的 s 仅由您的InfoRow
类的实例引用-并且您不保留对它的任何引用,因此所有这些都会立即被垃圾收集。(将 var 传递给Checkbutton()
实际上并不存储对 var 的引用,只是其自动生成的名称 -PY_VAR0
或其他任何内容。)
如果您完成了这个程序,您显然需要将InfoRow
s 存储在某个地方,以便您可以检索 var 值 - 这足以修复 Checkbuttons。
推荐阅读
- keras - Keras 分类交叉熵与二元交叉熵
- orgchart - 可以突出显示搜索找到的节点 - Orgchart
- git - 如何将贡献者(不是合作者)添加到私有 GitHub 存储库?
- c++ - 在 C++ 中使用 RegisterWaitForSingleObject 将参数传递给回调函数
- sql - 如何从子查询返回多个字段
- amazon-web-services - Docker 与 awsvpc 网络模式链接
- laravel - 我正在尝试将用户 ID 从我的刀片模板传递给 Vue,以便将 Axios 发布请求发送到服务器
- node.js - Nodejs Mongoose - 一个数据库调用 = 按不同标准排序的两个独立数组
- android - 如何返回上传图片的 URL
- python - 使用 Django rest-auth 的身份验证仅适用于超级用户。在其他情况下,我得到 - 无法使用提供的凭据登录