wxyj3496 发表于 2020-9-24 07:35:05

多个 Entry组件调用同一个validatecommand 的方法

本帖最后由 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*|[-+]?\.?\d*

)
    result = pattern.match(num)

    if result:
      return True
    else:
      return False


页: [1]
查看完整版本: 多个 Entry组件调用同一个validatecommand 的方法