为什么我的功能会在后面单击一次?

时间:2017-02-16 23:17:02

标签: python python-3.x tkinter

我试图重建我正在开发的项目中遇到的问题,我的功能似乎只是在后面点击一下。

我有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小部件没有类似的虚拟事件。

我该如何解决这个问题?

1 个答案:

答案 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构造函数中使用其名称。