当前位置: 首页 > 知识库问答 >
问题:

Tkinter变量不会随着函数中的检查按钮而改变

缪晋
2023-03-14

出于某种原因,我为Checkbutton变量编写的代码在函数内部时不会改变其工作方式,但是在函数外部和在其自身脚本中时,它会工作。下面是函数外部的代码

from tkinter import *

basket = ['apple','banana','orange']
win2 = Tk()
buttons = []
variables = []
for fruit in basket:
    variable = BooleanVar()
    checkbutton = Checkbutton(win2, text = fruit,variable = variable).pack()
    variables.append(variable)
    buttons.append(checkbutton)
Button(win2, text='Quit', command=win2.destroy).pack()
Button(win2, text='Peek', command=allstates).pack()
mainloop()

下面是在函数内部定义的代码

from tkinter import *
def selectfruit():
    def allstates(): 
        for variable in variables:
            print(variable.get())
    basket = ['apple','banana','orange']
    win2 = Tk()
    print(stls)
    buttons = []
    variables = []
    for fruit in basket:
        variable = BooleanVar()
        checkbutton = Checkbutton(win2, text = fruit,variable = variable).pack(side = TOP)
        variables.append(variable)
        buttons.append(checkbutton)
    Button(win2, text='Quit', command=win2.destroy).pack()
    Button(win2, text='Peek', command=allstates).pack()

对于代码的顶部,当我选中一个框时,变量变为True。对于最下面的一个,不管我做什么,它们都保持在False。

共有1个答案

仲孙翔飞
2023-03-14

给你的BooleanVar一个合适的主人/父母:

variable = BooleanVar(win2)

如果我没有弄错,没有显式设置master/父节点,
会自动使其成为隐式创建的全局root
的子节点(如在全局范围内写入root=Tk(),并将其用作父节点)。
(在您的情况下,如果您以前在全局范围创建了win2,
然后将隐式使用-请参阅下面的示例。)

因此,当您的代码在函数之外时,代码可以工作,
因为BooleanVar和CheckButton恰好具有相同的Tk/root。

当您将代码放入函数中时,
BooleanVar和CheckButton会得到不同的TK/根
(BooleanVar获取(可能隐式创建的)全局根,
CheckButton获取您在函数内创建的新win2)

编辑/澄清:
但是是的,使用Toplevel可能是正确的选择
只注意原始版本是什么<而且它可以

省略父项时的自动父项示例(直接从交互式解释器复制):

不指定父/主(此处,对于标签小部件),
在创建任何Tk小部件之前,隐式使用隐式创建的全局Tk/根
(这是在第一个“Label()”之后弹出的窗口)
(注意:隐式创建的全局Tk将不同于在其之后显式创建的任何Tk小部件)

>>> from tkinter import *
>>> l1 = Label()
>>> l2 = Label()
>>> id(l1.master) == id(l2.master)
True
>>> root = Tk()
>>> id(root) == id(l1.master)
False

未指定父/主(此处为标签小部件),
在显式创建Tk小部件后,使用已经存在的Tk小部件

>>> from tkinter import *
>>> root = Tk()
>>> l = Label()
>>> id(root) == id(l.master)
True
 类似资料:
  • 我有一个模态组件,当不同的组件突变字段时,我被触发。我有一个getter在我的Vuex商店叫。模态被从称为的本地数据栏中驱动出来,我已经将其设置为getter。我正在检查的值,并且在我触发modal之后它是,但是数据仍然是false。我到底做错了什么?

  • 每当在上运行我的应用程序时,我都无法将环境更改为开发。我已经搜索了有关此主题的相关链接,并尝试了所有解决方案和解决方案组合,但迄今为止都没有成功。每当我对任何模板文件或app.py文件进行更改时,我希望我的应用程序都能刷新。这是我尝试过的列表: 从我在Windows上的这个stackoverflow解决方案在我的终端上输入,所以我改为使用set Pip安装python-dotenv并在我的根目录中

  • 因此,我从文件夹中链接了两个HTML图像:images/但是在javascript中,我试图让骰子在每次刷新后随机更改这些图像。我不知道为什么它不起作用 下面是HTML代码 下面是js代码 注意:我是一个新的学习者,仍在努力理解javascript。谢谢你谦虚的回答和帮助。如果解释得简单一点,我就可以理解了。 修复上面的代码后 我在刷新页面时遇到问题这就是它显示的内容 在此处输入图像描述

  • 问题内容: 我正在尝试使用以下代码将一些JSON发布到具有cURL的Web服务: 我得到以下回报: string(282)“ HTTP / 1.1 200 OK服务器:Apache-Coyote / 1.1 Access-Control- Allow-Origin:*内容类型:text / plain内容长度:120日期:2011年3月18日,星期五:19:03:23 GMT {“ code”:“

  • 问题内容: 所有按钮都返回10。为什么? 我想要按钮1返回1,按钮2返回2 … 非常感谢您的帮助 问题答案: 您的匿名函数可以是闭包(如@abernert所指出的,在Python的情况下,它们 实际上并不是 闭包)-它们“封闭”了变量,以供以后引用。但是,它们不是在定义时查找值,而是 在调用 时查找值,这是整个循环结束 后 的某个时间(此时等于10)。 要解决此问题,您需要将的值重新绑定到其他东西

  • 我使用java中的模式“AES/CBC/PKCS7PADDING”在2个设备之间进行通信。 注意:这里我只放了加密代码,但我们有类似的解密代码。 在通信开始时已经发送了IV矢量。然后,我们希望这两个设备交换加密的消息,而不再发送IV。如果我们的理解是正确的,只要没有消息丢失,两个设备都应该知道在异或中使用的当前“向量”是什么。 然而,Java代码并不像我们期望的那样工作:如果我连续调用encryp