2014-02-17 92 views
2

我試圖在python中製作一個簡單的溫度轉換計算器。我想要做的是能夠輸入一個數字,並讓另一側自動更新,而不必按下按鈕。現在我只能讓它在一個方向上工作。我可以對它進行編碼,以便它可以從F到C或C到F.但是不能以任何方式。當條目改變時Python Tkinter更新

顯然after是不是要走的路。我需要某種onUpdate什麼的。 TIA!

import Tkinter as tk 

root = tk.Tk() 
temp_f_number = tk.DoubleVar() 
temp_c_number = tk.DoubleVar() 

tk.Label(root, text="F").grid(row=0, column=0) 
tk.Label(root, text="C").grid(row=0, column=1) 

temp_f = tk.Entry(root, textvariable=temp_f_number) 
temp_c = tk.Entry(root, textvariable=temp_c_number) 

temp_f.grid(row=1, column=0) 
temp_c.grid(row=1, column=1) 

def update(): 
    temp_f_float = float(temp_f.get()) 
    temp_c_float = float(temp_c.get()) 

    new_temp_c = round((temp_f_float - 32) * (5/float(9)), 2) 
    new_temp_f = round((temp_c_float * (9/float(5)) + 32), 2) 

    temp_c.delete(0, tk.END) 
    temp_c.insert(0, new_temp_c) 

    temp_f.delete(0, tk.END) 
    temp_f.insert(0, new_temp_f) 

    root.after(2000, update) 

root.after(1, update) 
root.mainloop() 

回答

5

你在找什麼是變量trace()方法。例如: -

def callback(*args): 
    print "variable changed!" 

var = DoubleVar() 
var.trace("w", callback) 

連接跟蹤回調爲每個DoubleVar的,對於temp_f_number一個更新temp_c_number值,反之亦然。您可能還需要在另一個內部禁用一個回調函數,以避免遞歸更新週期。

另一個注意事項 - 不要編輯輸入字段。相反,使用變量的set()方法。輸入字段將自動更新。

所以,完整的代碼看起來是這樣的:

import Tkinter as tk 

root = tk.Tk() 
temp_f_number = tk.DoubleVar() 
temp_c_number = tk.DoubleVar() 

tk.Label(root, text="F").grid(row=0, column=0) 
tk.Label(root, text="C").grid(row=0, column=1) 

temp_f = tk.Entry(root, textvariable=temp_f_number) 
temp_c = tk.Entry(root, textvariable=temp_c_number) 

temp_f.grid(row=1, column=0) 
temp_c.grid(row=1, column=1) 

update_in_progress = False 

def update_c(*args): 
    global update_in_progress 
    if update_in_progress: return 
    try: 
     temp_f_float = temp_f_number.get() 
    except ValueError: 
     return 
    new_temp_c = round((temp_f_float - 32) * 5/9, 2) 
    update_in_progress = True 
    temp_c_number.set(new_temp_c) 
    update_in_progress = False 

def update_f(*args): 
    global update_in_progress 
    if update_in_progress: return 
    try: 
     temp_c_float = temp_c_number.get() 
    except ValueError: 
     return 
    new_temp_f = round(temp_c_float * 9/5 + 32, 2) 
    update_in_progress = True 
    temp_f_number.set(new_temp_f) 
    update_in_progress = False 

temp_f_number.trace("w", update_c) 
temp_c_number.trace("w", update_f) 

root.mainloop()