繁体   English   中英

Tkinter 变量不随 function 中的 Checkbutton 改变

[英]Tkinter variable not changing with Checkbutton in function

出于某种原因,我的 Checkbutton 变量代码在 function 内部时不会改变工作,但是,它在 function 外部和它自己的脚本中工作。 这是 function 外部的代码

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

这是在 function 内部定义的代码

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

对于代码的顶部,当我选中一个框时,变量 go 为 True。 对于底部的一个,无论我做什么,它们都保持为 False。

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

variable = BooleanVar(win2)

如果我没记错的话,没有明确设置主人/父母,
自动使它成为隐式创建的全局根的子节点
(比如在全局 scope 处编写root = Tk() ,并将其用作父级)。
(在你的例子中,如果你之前在全局 scope 创建了 win2,
那么这将被隐式使用 - 请参见下面的示例。)

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

当您将代码放入 function 时,
BooleanVar 和 CheckButton 获得不同的 Tks/roots。
(BooleanVar 获取(可能是隐式创建的)全局根,
CheckButton 获取您在函数内部创建的新 win2)

编辑/澄清:
但是,是的,使用 Toplevel 可能是正确的选择。
只需注意原始问题是什么;
它可以并且确实适用于多个 Tk 小部件。


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

不指定父/主(此处为 Label 小部件),
创建任何 Tk 小部件之前
==
隐式使用,隐式创建的全局 Tk/root
(这是在第一个“Label()”之后弹出的 window)
(注意:隐式创建的全局 Tk 会有所不同
来自在它之后明确创建的任何 Tk 小部件)

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

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

>>> from tkinter import *
>>> root = Tk()
>>> l = Label()
>>> id(root) == id(l.master)
True

出于某种原因,我的 Checkbutton 变量代码在 function 内部时不会改变工作,但是,它在 function 外部及其自己的脚本中工作。 这是 function 外部的代码

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

这是在 function 内部定义的代码

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

对于代码的最高位,当我选中一个框时,变量 go 为 True。 对于最底层的,无论我做什么,他们都留在 False。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM