我试图重建一个我正在开发的项目中遇到的问题,其中我的函数似乎正在运行后面的一个点击。为什么我的功能在后面点击一下?
我有3个spinboxes。任何给定的前两个spinbox中的值的组合都应该确定第三个值的值,该值取自一些嵌套列表。
例如,spinbox_1中的'0'和spinbox_2中的'A'应该将spinbox_3的值设置为'1'。和spinboxes_2中的'1'和'A',以及spinbox_3中的'4'。但是,将spinbox_1从'0'滚动到'1'将使spinbox_3保持不变 - 只有当我再次单击它时,才会将其更改为'4',届时应该从'4'更改为'7'。
from tkinter import *
import tkinter as tk
root = Tk()
sp1_values = [0, 1, 2]
abc_values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
def set_default_in_sp3(args):
selected = var1.get()
idx = selected
lvl = var2.get()
if idx == 0:
if lvl == 'A':
var3.set(abc_values[0][0])
if lvl == 'B':
var3.set(abc_values[0][1])
if lvl == 'C':
var3.set(abc_values[0][2])
if idx == 1:
if lvl == 'A':
var3.set(abc_values[1][0])
if lvl == 'B':
var3.set(abc_values[1][1])
if lvl == 'C':
var3.set(abc_values[1][2])
if idx == 2:
if lvl == 'A':
var3.set(abc_values[2][0])
if lvl == 'B':
var3.set(abc_values[2][1])
if lvl == 'C':
var3.set(abc_values[2][2])
var1 = tk.IntVar()
var2 = tk.StringVar()
var3 = tk.IntVar()
spinbox_1=tk.Spinbox(textvariable=var1, values=sp1_values)
spinbox_1.pack()
spinbox_1.bind('<Button-1>', set_default_in_sp3)
spinbox_2=tk.Spinbox(values=('A', 'B', 'C'), textvariable = var2)
spinbox_2.pack()
spinbox_3=tk.Spinbox(from_=1, to=10, increment=1, textvariable = var3)
spinbox_3.pack()
spinbox_3.bind('<Button-1>', set_default_in_sp3)
root.mainloop()
在回答类似的问题也被张贴在SO(Tkinter Label bound to StringVar is one click behind when updating),涉及到一个列表框,并建议说:“最好的解决办法是绑定到虚拟事件‘ListboxSelect’字样的标签,并尽量我所看到的有在Tkinter的纺纱器插件没有类似的虚拟事件。
我如何去解决这个问题呢?
'spinbox'有一个命令属性,可以让你指定一个函数在修改完成后调用。 –
这似乎工作 - 感谢。但是,在我正在处理的项目中,命令属性已分配给每个spinbox的另一个函数,是否有将多个函数分配给command属性的方法? – MarkyMark