有如下三个entry: 十六进制,十进制和二进制;
任意一个输入发生变化,其它值就随之变化。
但是注意, 由于hex/dec/bin_string_change 函数都调用了**update_all_widgets()**函数,其会更新三个entry的数值。实际代码运行一团糟:
因为update_all_widgets更新了几个var, 同时var又绑定了trace, trace又会走进update_all_widgets, 导致不可预知的异常。因此,需要对update_all_widgets函数下手。为了解决这个问题,在var_update函数中先取消掉对trace的监听,然后再更新变量的值,最后重新添加trace监听。这样可以避免在更新变量值时再次触发回调函数。
需要注意的是,trace_vdelete 方法的第二个参数应该是回调函数的索引或标识符,而不是回调函数本身, 否则运行会报错。
def hex_string_change(*args):
global bin_parameter
bin_parameter.hex_string = hex_var.get()
update_all_widgets()
def dec_string_change(*args):
global bin_parameter
bin_parameter.dec_string = dec_var.get()
update_all_widgets()
def bin_string_change(*args):
global bin_parameter
bin_parameter.bin_string = bin_var.get()
update_all_widgets()
hex_label = tkinter.Label(root, text="hex: ", width=6, height=1, bg="#C0CCF5", fg="#182261")
hex_label.grid(row=5, column=0, sticky="w", columnspan=4, padx=(10, 0), pady=(0, 10))
hex_var = tkinter.StringVar()
hex_entry = tkinter.Entry(root, width=10, textvariable=hex_var)
hex_var.set("0")
hex_entry.grid(row=5, column=3, sticky="w", columnspan=6, pady=(0, 10))
hex_id = hex_var.trace("w", hex_string_change)
dec_label = tkinter.Label(root, text="dec: ", width=6, height=1, bg="#C0CCF5", fg="#182261")
dec_label.grid(row=5, column=7, sticky="w", columnspan=4, padx=(10, 0), pady=(0, 10))
dec_var = tkinter.StringVar()
dec_entry = tkinter.Entry(root, width=12, textvariable=dec_var)
dec_var.set("0")
dec_entry.grid(row=5, column=10, sticky="w", columnspan=6, padx=(5, 0), pady=(0, 10))
dec_id = dec_var.trace("w", dec_string_change)
bin_label = tkinter.Label(root, text="bin: ", width=6, height=1, bg="#C0CCF5", fg="#182261")
bin_label.grid(row=5, column=15, sticky="w", columnspan=4, padx=(15, 0), pady=(0, 10))
bin_var = tkinter.StringVar()
bin_entry = tkinter.Entry(root, width=28, textvariable=bin_var)
bin_var.set("0")
bin_entry.grid(row=5, column=18, sticky="w", columnspan=20, padx=(12, 10), pady=(0, 10))
bin_id = bin_var.trace("w", bin_string_change)
def release_all_trace():
global sel_id, hex_id, dec_id, bin_id
sel_var.trace_vdelete("w", sel_id)
hex_var.trace_vdelete("w", hex_id)
dec_var.trace_vdelete("w", dec_id)
bin_var.trace_vdelete("w", bin_id)
def acquire_all_trace():
global sel_id, hex_id, dec_id, bin_id
sel_id = sel_var.trace("w", sel_range_change)
hex_id = hex_var.trace("w", hex_string_change)
dec_id = dec_var.trace("w", dec_string_change)
bin_id = bin_var.trace("w", bin_string_change)
def update_all_widgets():
global bin_parameter
release_all_trace()
for i in range(32):
button_set(i, bin_parameter.bin_string.zfill(32)[i])
sel_display_label["text"] = f"'d{bin_parameter.dec_string_sel} ('h{bin_parameter.hex_string_sel.upper()})"
hex_var.set(bin_parameter.hex_string.upper())
dec_var.set(bin_parameter.dec_string)
bin_var.set(bin_parameter.bin_string)
acquire_all_trace()