通过Tk小部件/窗口路径名访问小部件

阿尔伯特

我正在使用validatecommand“动态”观察和验证输入小部件的输入。

的标准用法是validatecommand防止将无效字符输入到观察到的输入小部件中。这不是我喜欢的行为,因此我曾经在任何情况下validatecommand都将entry小部件的字符串传递给另一个函数return Truefloatstr_to_float使用正则表达式验证字符串preg

如果正则表达式匹配输入有效,则一切正常,因此print('approved')被执行。但是,如果用户输入了无效输入,则将执行正则表达式不匹配,print('not approved')并且应将适当的输入小部件填充为红色(尚未正确实现颜色更改)。

到目前为止,我所做的是更改了第一个条目小部件的背景,<widget>.config(bg=<background>)以检查是否可以通过索引所有已创建的条目小部件的列表来访问每个小部件。

validatecommand可以将几个参数传递给执行的函数(例如,输入/文本字符串和小部件/窗口路径名)。因此,获得对无效小部件的引用通常不是问题。但是,传递的路径名validatecommand似乎无法通过python访问。如何通过<widget>.config(bg=<background>)在包含(无效)输入的小部件上执行从此路径名获取引用(例如,唯一变量名称)以更改背景

-MWE-

#!/usr/bin/env python3
# -*- coding: <utf-8> -*-

# code adapted from:
# http://stackoverflow.com/questions/4140437/python-tkinter-interactively-validating-entry-widget-content

import tkinter as tk
import re

class MyApp():
    def __init__(self):
        self.root = tk.Tk()
        self.parameternames = [
            ('a', 'U'), ('b', 'U'), ('c', 'U'), ('d', 'U'), ('e', 'U'),
            ('f', 'U'), ('g', 'U'), ('h', 'U'), ('i', 'U'), ('j', 'U'),
            ('k', 'U'), ('l', 'U'), ('m', 'U'), ('n', 'U'), ('o', 'U'),
            ('p', 'U'), ('q', 'U'), ('r', 'U'), ('s', 'U'), ('t', 'U')]
        self.vcmd = (self.root.register(self.OnValidate), '%P', '%W')
        self.create_widgets()

    def create_widgets(self):
        self.entries = []
        for i in enumerate(self.parameternames):
            entry = tk.Entry(self.root, validate="all", validatecommand=self.vcmd)
            self.default_bg = entry.cget("bg")
            entry.pack()
            self.entries.append(entry)
        self.root.mainloop()

    def OnValidate(self, P, W):
        # %P = value of the entry if the edit is allowed
        # %W = the tk name of the widget (pathname)
        print("OnValidate:")
        print("P='%s'" % P )
        print("W='%s'" % W )
        self.floatstr_to_float(P, W)
        # return True to display inserted character, validation is done by a re in 'floatstr_to_float()'
        return True

    def floatstr_to_float(self, fs, W):
        preg = re.compile('^\s*(?P<int>\d*)\s*[\.,]?\s*(?P<dec>\d*)\s*$')
        m = preg.match(fs)
        if m:
            print('approved')
            intprt=m.group('int')
            frcprt=m.group('dec')
            f = 0. if (intprt == '' and frcprt == '') else float('%s.%s' %(intprt, frcprt)) # not needed yet
            # currently:    just changing the color of the first entry widget (proof of concept)
            # aim:          pass unique name of edited entry widget to self.change_bg() for changing bg of
            #               appropriate entry widget
            self.change_bg(self.entries[0], 1)
        else:
            print('not approved')
            # see comment in if-statement above
            self.change_bg(self.entries[0], 0)

    def change_bg(self, name, approved):
        if approved == 1:
            name.config(bg=self.default_bg)
        else:
            name.config(bg='#d9534f')

app=MyApp()
fhdrsdg

您可以使用的nametowidget方法Tk这将基于其名称查找小部件。因此使用:

self.change_bg(self.root.nametowidget(W), 1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python Tkinter:访问小部件的子小部件

来自分类Dev

从函数访问QTextEdit小部件

来自分类Dev

Tcl / Tk小部件路径名的长度或嵌套是否有限制?

来自分类Dev

文本窗口小部件索引异常行为?(Tcl / Tk)

来自分类Dev

如何访问父窗口小部件元素?

来自分类Dev

从插槽访问中央窗口小部件时出现段故障

来自分类Dev

Web2py:从定制窗口小部件访问行

来自分类Dev

通过Tk小部件/窗口路径名访问小部件

来自分类Dev

访问小部件停止处理

来自分类Dev

通过addPostFrameCallback的Flutter Provider访问说窗口小部件不在窗口小部件树中,但Flutter检查器显示为其他

来自分类Dev

如何访问窗口小部件或刚刚单击的按钮的文本?

来自分类Dev

Flutter,访问父容器窗口小部件的填充值

来自分类Dev

无法从状态窗口小部件访问属性

来自分类Dev

访问小部件停止处理

来自分类Dev

访问QTabWidget的小部件

来自分类Dev

窗口大小不会扩展窗口小部件

来自分类Dev

调整父窗口小部件的大小时,通过保持宽高比来调整子窗口小部件的大小

来自分类Dev

Python Tkinter:访问小部件的子小部件

来自分类Dev

无法从Qt中的另一个窗口小部件访问窗口小部件中的控件

来自分类Dev

通过按钮访问父窗口小部件的变量

来自分类Dev

Tk窗口布局,窗口小部件尺寸最大化

来自分类Dev

Web2py:从定制窗口小部件访问行

来自分类Dev

如何通过意图将数据从窗口小部件配置类传递到窗口小部件提供程序类?

来自分类Dev

Google窗口小部件链接

来自分类Dev

__init__中的Kivy窗口小部件ID访问

来自分类Dev

访问QStackWidget中的小部件

来自分类Dev

如何通过在根窗口小部件中使用方法来更改子窗口小部件的属性?

来自分类Dev

对Web小部件的访问受限

来自分类Dev

Perl/Tk 小部件列表

Related 相关文章

  1. 1

    Python Tkinter:访问小部件的子小部件

  2. 2

    从函数访问QTextEdit小部件

  3. 3

    Tcl / Tk小部件路径名的长度或嵌套是否有限制?

  4. 4

    文本窗口小部件索引异常行为?(Tcl / Tk)

  5. 5

    如何访问父窗口小部件元素?

  6. 6

    从插槽访问中央窗口小部件时出现段故障

  7. 7

    Web2py:从定制窗口小部件访问行

  8. 8

    通过Tk小部件/窗口路径名访问小部件

  9. 9

    访问小部件停止处理

  10. 10

    通过addPostFrameCallback的Flutter Provider访问说窗口小部件不在窗口小部件树中,但Flutter检查器显示为其他

  11. 11

    如何访问窗口小部件或刚刚单击的按钮的文本?

  12. 12

    Flutter,访问父容器窗口小部件的填充值

  13. 13

    无法从状态窗口小部件访问属性

  14. 14

    访问小部件停止处理

  15. 15

    访问QTabWidget的小部件

  16. 16

    窗口大小不会扩展窗口小部件

  17. 17

    调整父窗口小部件的大小时,通过保持宽高比来调整子窗口小部件的大小

  18. 18

    Python Tkinter:访问小部件的子小部件

  19. 19

    无法从Qt中的另一个窗口小部件访问窗口小部件中的控件

  20. 20

    通过按钮访问父窗口小部件的变量

  21. 21

    Tk窗口布局,窗口小部件尺寸最大化

  22. 22

    Web2py:从定制窗口小部件访问行

  23. 23

    如何通过意图将数据从窗口小部件配置类传递到窗口小部件提供程序类?

  24. 24

    Google窗口小部件链接

  25. 25

    __init__中的Kivy窗口小部件ID访问

  26. 26

    访问QStackWidget中的小部件

  27. 27

    如何通过在根窗口小部件中使用方法来更改子窗口小部件的属性?

  28. 28

    对Web小部件的访问受限

  29. 29

    Perl/Tk 小部件列表

热门标签

归档