2017-02-16 71 views
1

我试图重建一个我正在开发的项目中遇到的问题,其中我的函数似乎正在运行后面的一个点击。为什么我的功能在后面点击一下?

我有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的纺纱器插件没有类似的虚拟事件。

我如何去解决这个问题呢?

+0

'spinbox'有一个命令属性,可以让你指定一个函数在修改完成后调用。 –

+0

这似乎工作 - 感谢。但是,在我正在处理的项目中,命令属性已分配给每个spinbox的另一个函数,是否有将多个函数分配给command属性的方法? – MarkyMark

回答

2

正如@Bryan奥克利说,你可以使用在Spinbox ES的command选项指定一个函数在它们改变时被调用,你也不需要bi向每个人发送鼠标按钮。我还注意到并删除了函数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构造函数使用其名称。

相关问题