是否有方法检测Tkinter变量是否已由用户更改而不是内部更改?

2024-06-02 13:43:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个更大的程序,可以加载和显示用户创建的对象。每个对象都有特定的设置,可以通过菜单中的复选按钮进行更改。加载对象时,使用.set()将显示设置覆盖为该对象具有的任何特定设置。我正在使用.trace()修改设置更改时的显示。问题是我希望回调只在用户更改时发生,而不是在加载新对象和覆盖设置时发生

为了使问题更简单,假设我有4个复选框和一个打印用户单击的索引的函数。然后我有一个按钮,只检查偶数框。有没有办法让我的回调函数printIndex只在用户单击复选框时发生,而不是在按钮设置值时发生

enter image description here

以下是简化代码:

import tkinter as tk

def printIndex(index):
    print("User clicked {}".format(index))

def setOnlyOdds():
    print("\nSetting only Evens")
    for i in range(4):
        value = True if (i + 1 ) % 2 == 0 else False
        print("{} is being set to {}".format(i+1,value))
        bools[i].set(value)

root = tk.Tk()
root.title("Qhat Apps")
root.grid()

bools = [] # 4 total 
checkBoxes = [] # 4 total
for i in range(4):
    bools.append(tk.BooleanVar())
    checkBoxes.append(tk.Checkbutton(root,variable = bools[i]))
    checkBoxes[i].grid(column = 1, row = i)

label1 = tk.Label(text = "1").grid(column = 0, row = 0)
label2 = tk.Label(text = "2").grid(column = 0, row = 1)
label3 = tk.Label(text = "3").grid(column = 0, row = 2)
label4 = tk.Label(text = "4").grid(column = 0, row = 3)

bools[0].trace("w", lambda *args: printIndex(1))
bools[1].trace("w", lambda *args: printIndex(2))
bools[2].trace("w", lambda *args: printIndex(3))
bools[3].trace("w", lambda *args: printIndex(4))

evens = tk.Button(root,text = "Only Evens", command = setOnlyOdds).grid(columnspan = 2)

root.mainloop()

提前谢谢


Tags: 对象lambdatext用户traceargscolumnroot
1条回答
网友
1楼 · 发布于 2024-06-02 13:43:27

因此,我更改了我的checkbutton,使其具有该命令,而不是将其放在跟踪中

import tkinter as tk

def printIndex(index):
    print("User clicked {}".format(index))

def setOnlyOdds():
    print("\nSetting only Evens")
    for i in range(4):
        value = True if (i + 1 ) % 2 == 0 else False
        print("{} is being set to {}".format(i+1,value))
        bools[i].set(value)

root = tk.Tk()
root.title("Qhat Apps")
root.grid()

bools = [] # 4 total 

for i in range(4):
    bools.append(tk.BooleanVar())
checkBox1 = tk.Checkbutton(root,variable = bools[0], command = lambda: printIndex(1))
checkBox2 = tk.Checkbutton(root,variable = bools[1], command = lambda: printIndex(2))
checkBox3 = tk.Checkbutton(root,variable = bools[2], command = lambda: printIndex(3))
checkBox4 = tk.Checkbutton(root,variable = bools[3], command = lambda: printIndex(4))
checkBox1.grid(column = 1, row = 0)
checkBox2.grid(column = 1, row = 1)
checkBox3.grid(column = 1, row = 2)
checkBox4.grid(column = 1, row = 3)

label1 = tk.Label(text = "1").grid(column = 0, row = 0)
label2 = tk.Label(text = "2").grid(column = 0, row = 1)
label3 = tk.Label(text = "3").grid(column = 0, row = 2)
label4 = tk.Label(text = "4").grid(column = 0, row = 3)

evens = tk.Button(root,text = "Only Evens", command = setOnlyOdds).grid(columnspan = 2)

root.mainloop()

相关问题 更多 >