鱼C论坛

 找回密码
 立即注册
查看: 2531|回复: 0

[学习笔记] 多个 Entry组件调用同一个validatecommand 的方法

[复制链接]
发表于 2020-9-24 07:35:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wxyj3496 于 2020-9-24 07:35 编辑

小甲鱼的tkinter教程中,详细介绍了如何在Entry组件中使用validatecommand的方法,使用函数对Entry的内容进行判读。我在用tkinter编写界面时使用了这个功能,但过程中遇到这样一种情况:
我的界面中有很多个Entry组件,每个都需要判断输入内容是否为数字,执行代码是相同的,只是执行的变量不同。我开始每个Entry对应一个函数,我有十几个Entry,使得程序很繁琐。

我就使用小甲鱼例子的方法,若将Entry的内容作为参数传给validatecommand就可以用同一个函数了,使用“%P”传入当前内容的方法,如下:
  1. e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=(testCMD, '%P''))
复制代码
但是这个方法只能对内容判读,却无法更改。(我的功能是判读内容是否为数字,若是保留,若不是则清空)。


通过摸索总结了另一种方法,多个Entry可以使用同一函数,并且可以读写,要点如下:
  • 使用“%W”传递Entry的名字
  • 使用tkinter内建的方法“nametowidget”将Entry的名字转换为组件


下面是代码:
  1. import tkinter as tk
  2. from tkinter import ttk

  3. class MainWindow():
  4.         def __init__(self):
  5.                 self.win = tk.Tk()
  6.                 self.creat_widgets()
  7.         
  8.         def testfloat(self,name_entry):
  9.                 widget = self.win.nametowidget(name_entry)  #将名字转换为组件
  10.                 textin = widget.get()
  11.                 if ltgen.is_number(textin):                # ltgen.isnumber 是判断是否字符的通用代码
  12.                         return True
  13.                 else:
  14.                         widget.delete(0,tk.END)
  15.                         return False
  16.         
  17.         def create_widgets(self):
  18.                 self.temp_enterVar  = tk.StringVar()
  19.                 self.testtemp = self.win.register(self.testfloat)  #注册函数,注册一次可以复用
  20.                 self.temp_entered = ttk.Entry(frame_temptran,width = 12,\
  21.                                 textvariable = self.temp_enterVar, validate = 'focusout',\
  22.                                 validatecommand = (self.testtemp,'%W') )      


  23. win_main = MainWindow()
  24. win_main.win.mainloo()

复制代码



is_number是我搜集的一段判断是否为数字的代码,我存在一个.py文件里作为通用代码,需要时调用

  1. import re

  2. def is_number(num):
  3.     pattern = re.compile(r'^[-+]?[-0-9]\d*\.\d*|[-+]?\.?[0-9]\d*

  4. )
  5.     result = pattern.match(num)

  6.     if result:
  7.         return True
  8.     else:
  9.         return False
复制代码



本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 19:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表