python - 有没有办法检测 Tkinter 变量是否已被用户更改而不是内部更改?
问题描述
我有一个更大的程序,我正在处理它加载和显示用户创建的对象。每个对象都有特定的设置,可以通过菜单中的复选按钮进行更改。加载对象时,使用 .set() 将显示设置覆盖到对象具有的任何特定设置。更改设置时,我正在使用 .trace() 来修改显示。问题是我希望回调仅在用户更改时发生,而不是在加载新对象并覆盖设置时发生。
为了使问题更简单,假设我有 4 个复选框和一个打印用户单击的索引的函数。然后我有一个只检查偶数框的按钮。有没有办法让我的回调函数 printIndex 仅在用户单击复选框时发生,而不是在按钮设置值时发生?
这是简化的代码:
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()
提前致谢!
解决方案
所以我改变了我的检查按钮来拥有命令而不是把它放在跟踪中。
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()
推荐阅读
- c# - 只允许一个帐户访问网站上的一个移动应用程序和浏览器
- spring-cloud-dataflow - Spring Cloud 数据流——rabbitmq source sink 示例
- docker - 在线推送本地 docker 镜像到 openshift
- c++ - std::set - 计数的目的是什么?
- regex - 不均匀的数据集正则表达式
- python - 在 django 中查询总计
- ios - Spritekit:将Angular Impulse应用于爆炸节点的所有周围节点
- android - 当我们将旧版本更新到新版本时,共享偏好和数据库问题
- javascript - 使用 MongoDB Stitch webhook 服务函数,如何将返回的“insertedId”转换为字符串?
- .net - 用于 Azure 服务总线的 MassTransit 批量接收消息以避免限制