我试图重建我正在开发的项目中遇到的问题,我的功能似乎只是在后面点击一下。
我有3个旋转盒。前两个旋转框中任何给定的值组合应确定第三个值的值,该值取自某些嵌套列表。
例如,spinbox_1中的“0”和spinbox_2中的“A”应将spinbox_3的值设置为“1”。旋转框_2和_3中的'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小部件没有类似的虚拟事件。
我该如何解决这个问题?
答案 0 :(得分:2)
正如@Bryan Oakley所说,您可以使用command
es上的Spinbox
选项来指定更改时要调用的函数。您也不需要将鼠标按钮绑定到每个按钮。我还注意到并删除了函数set_default_in_sp3
中的一些重复代码。
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):
idx = int(var1.get())
lvl = var2.get()
if lvl == 'A':
var3.set(abc_values[idx][0])
if lvl == 'B':
var3.set(abc_values[idx][1])
if lvl == 'C':
var3.set(abc_values[idx][2])
var1 = tk.IntVar()
var2 = tk.StringVar()
var3 = tk.IntVar()
spinbox_1=tk.Spinbox(textvariable=var1, values=sp1_values, command=set_default_in_sp3)
spinbox_1.pack()
spinbox_2=tk.Spinbox(values=('A', 'B', 'C'), textvariable=var2, command=set_default_in_sp3)
spinbox_2.pack()
spinbox_3=tk.Spinbox(from_=1, to=10, increment=1, textvariable=var3,
command=set_default_in_sp3)
spinbox_3.pack()
root.mainloop()
您无法为command
回调分配多个函数,但您可以编写另一个函数来调用一个或多个其他函数,并在Spinbox
构造函数中使用其名称。