马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 wxyj3496 于 2020-9-24 07:35 编辑
小甲鱼的tkinter教程中,详细介绍了如何在Entry组件中使用validatecommand的方法,使用函数对Entry的内容进行判读。我在用tkinter编写界面时使用了这个功能,但过程中遇到这样一种情况:
我的界面中有很多个Entry组件,每个都需要判断输入内容是否为数字,执行代码是相同的,只是执行的变量不同。我开始每个Entry对应一个函数,我有十几个Entry,使得程序很繁琐。
我就使用小甲鱼例子的方法,若将Entry的内容作为参数传给validatecommand就可以用同一个函数了,使用“%P”传入当前内容的方法,如下:e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=(testCMD, '%P''))
但是这个方法只能对内容判读,却无法更改。(我的功能是判读内容是否为数字,若是保留,若不是则清空)。
通过摸索总结了另一种方法,多个Entry可以使用同一函数,并且可以读写,要点如下:
- 使用“%W”传递Entry的名字
- 使用tkinter内建的方法“nametowidget”将Entry的名字转换为组件
下面是代码:import tkinter as tk
from tkinter import ttk
class MainWindow():
def __init__(self):
self.win = tk.Tk()
self.creat_widgets()
def testfloat(self,name_entry):
widget = self.win.nametowidget(name_entry) #将名字转换为组件
textin = widget.get()
if ltgen.is_number(textin): # ltgen.isnumber 是判断是否字符的通用代码
return True
else:
widget.delete(0,tk.END)
return False
def create_widgets(self):
self.temp_enterVar = tk.StringVar()
self.testtemp = self.win.register(self.testfloat) #注册函数,注册一次可以复用
self.temp_entered = ttk.Entry(frame_temptran,width = 12,\
textvariable = self.temp_enterVar, validate = 'focusout',\
validatecommand = (self.testtemp,'%W') )
win_main = MainWindow()
win_main.win.mainloo()
is_number是我搜集的一段判断是否为数字的代码,我存在一个.py文件里作为通用代码,需要时调用
import re
def is_number(num):
pattern = re.compile(r'^[-+]?[-0-9]\d*\.\d*|[-+]?\.?[0-9]\d*
)
result = pattern.match(num)
if result:
return True
else:
return False
|