python - 为什么我的函数落后一键运行?

标签 python python-3.x tkinter

我尝试重建我正在开发的项目中遇到的问题,其中我的函数似乎运行一键后。

我有 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所说,您可以使用Spinboxes上的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/

相关文章:

python - 在 Python 中测试抽象类

Python 索引错误 : string index out of range

python - 程序的主循环可以移出GUI吗?

python - 使用 python tkinter 将键单击绑定(bind)到树中的选定项目

python - 返回光标的文本小部件

python - 体面的数字 |帮助降低时间复杂度

python - 如何满足 Python 中 AWS CDK Lambda 的 CfnFunction "code"参数?

python - 使用错误(旧)数据库设置的 Django 项目

python - 你如何在python中定义本地路径

python-3.x - 绘制均匀连续分布的 CDF