[英]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.