Python3中能否向Tkinter校验回调函数传递自定义参数?
Tkinter Entry校验传参问题解答
运行逻辑说明
mainwindow.register(回调函数)的作用是将Python侧定义的函数包装为Tkinter底层Tcl解释器可识别的调用句柄,注册时只需传入函数本身的引用,不要加括号执行函数。你之前报错的写法是直接执行了callback_int(input,typez='popo'),把函数返回的布尔值传给了注册方法,自然无法正常触发校验。validatecommand接收的元组中,第一个元素是注册后的函数句柄,后续所有元素都会按顺序作为参数传入校验函数:其中带%前缀的是Tkinter内置替换符,%P代表输入框修改后即将生效的新内容;你要加的自定义参数直接在元组末尾追加即可。
合并校验函数的正确实现
你可以按以下写法合并两个校验逻辑,通过自定义参数区分校验类型:
import tkinter as tk from tkinter import IntVar,StringVar # 合并后的统一校验函数 def validate_input(input_str, validate_type): # 整数校验逻辑 if validate_type == 'int': if input_str.isdigit() or input_str == "": return True else: print(input_str) return False # 浮点数/分数校验逻辑 elif validate_type == 'num_str': if len(input_str) >=1 and input_str[0] == '/': return False if all([s.isdigit() or s =='/' for s in input_str]) and input_str.count('/') <= 1: return True elif all([s.isdigit() or s =='.' for s in input_str]) and input_str.count('.') <= 1: return True else: print('no valid input : ',input_str) return False def mainwindow(): mainwindow = tk.Tk() mainwindow.geometry('350x350') tk.Label(mainwindow, text="enter parameters below").grid(row=1) getN = IntVar() geti0 = IntVar() getr0 = IntVar() getbeta = StringVar(mainwindow, value='0') getgamma = StringVar(mainwindow, value='0') tk.Label(mainwindow, text="N").grid(row=2) tk.Label(mainwindow, text="i0").grid(row=3) tk.Label(mainwindow, text="r0").grid(row=4) tk.Label(mainwindow, text="beta").grid(row=5) tk.Label(mainwindow, text="gamma").grid(row=6) e1 = tk.Entry(mainwindow,textvariable = getN) e1.grid(row=2, column=1) e2 = tk.Entry(mainwindow,textvariable = geti0) e2.grid(row=3, column=1) e3 = tk.Entry(mainwindow,textvariable = getr0) e3.grid(row=4, column=1) e4 = tk.Entry(mainwindow,textvariable = getbeta) e4.grid(row=5, column=1) e5 = tk.Entry(mainwindow,textvariable = getgamma) e5.grid(row=6, column=1) # 仅需注册一次统一校验函数 reg_validate = mainwindow.register(validate_input) # 校验整数的输入框,在%P后追加自定义参数'int' e1.config(validate ="key", validatecommand =(reg_validate, '%P', 'int')) e2.config(validate ="key", validatecommand =(reg_validate, '%P', 'int')) e3.config(validate ="key", validatecommand =(reg_validate, '%P', 'int')) # 校验浮点数/分数的输入框,在%P后追加自定义参数'num_str' e4.config(validate ="key", validatecommand =(reg_validate, '%P', 'num_str')) e5.config(validate ="key", validatecommand =(reg_validate, '%P', 'num_str')) solve = tk.Button(mainwindow, text='solve!', command=lambda: [values()]).grid(row=7, column=1, sticky=tk.W, pady=4) def values(): readN = getN.get() readi0 = geti0.get() readr0 = getr0.get() readbeta = eval(getbeta.get(),{"builtins": {}}) readgamma = eval(getgamma.get(), {"builtins": {}}) intN = int(readN) inti0 = int(readi0) intr0 = int(readr0) intbeta = float(readbeta) intgamma = float(readgamma) print(intN,'\n',inti0,'\n',intr0,'\n',intbeta,'\n',intgamma) mainwindow.mainloop() mainwindow()
内容的提问来源于stack exchange,提问作者pippo1980
相关产品推荐
相关产品推荐

