tkinter组件trace()导致函数跑飞的解决方法

有如下三个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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值