2014-02-17 2 views
2

Я пытаюсь сделать простой калькулятор преобразования температуры в python. Я хочу сделать это, чтобы иметь возможность вводить число и автоматически обновлять другую сторону, не нажимая кнопку. Сейчас я могу заставить его работать только в одном направлении. Я могу либо закодировать его так, чтобы он мог идти от F до C, либо от C до F. Но не в любом случае.Обновление Python Tkinter при изменении записи

Очевидно, что after - это не путь. Мне нужен какой-то onUpdate или что-то в этом роде. ТИА!

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() 
Смежные вопросы