我尝试重建我正在开发的项目中遇到的问题,其中我的函数似乎运行一键后。
我有 3 个旋转盒。前两个旋转框中的值的任何给定组合都应确定第三个旋转框中的值,该值取自一些嵌套列表。
例如 spinbox_1 中的“0”和 spinbox_2 中的“A”,应将 spinbox_3 的值设置为“1”。以及 spinboxes_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 ) 上发布的类似问题的答案中,涉及列表框和标签,建议“最好的解决方案是绑定(bind)到虚拟事件‘ListboxSelect’,据我所知可以看到 Tkinter 中的 spinbox 小部件没有类似的虚拟事件。
我该如何解决这个问题?
最佳答案
正如@Bryan Oakley所说,您可以使用Spinbox
es上的command
选项来指定当它们发生变化时要调用的函数。您也不需要将鼠标按钮绑定(bind)到每个按钮。我还注意到并删除了函数 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
构造函数中使用其名称.
关于python - 为什么我的函数落后一键运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286550/