2017-02-16 73 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構造函數使用其名稱。

相關問題