簡體   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