我想在python中制作一个简单的温度转换计算器.我想要做的是能够输入一个数字,并让另一方自动更新,而无需按下按钮.现在我只能朝一个方向努力.我可以编码它,以便它可以从F到C,或从C到F.但不是两种方式.
显然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()
Run Code Online (Sandbox Code Playgroud)
tra*_*ph3 10
.trace即将被弃用,请.trace_add改用:
var = tk.StringVar()
var.trace_add('write', callback)
Run Code Online (Sandbox Code Playgroud)
相同的功能,但您必须传递writeorread而不是wor r。
您正在寻找的是变量trace()方法.例如:
def callback(*args):
print "variable changed!"
var = DoubleVar()
var.trace("w", callback)
Run Code Online (Sandbox Code Playgroud)
为每个DoubleVar附加跟踪回调,temp_f_number为一个更新temp_c_number值,反之亦然.您可能还需要在另一个内部禁用一个回调函数,以避免递归更新周期.
另一个注意事项 - 不要编辑Entry字段.相反,使用变量的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()
Run Code Online (Sandbox Code Playgroud)