模式匹配 Tkinter 子小部件 (winfo_children) 以确定类型

J.W*_*ong 4 python tkinter widget pattern-matching

我正在尝试自动清除Entry父小部件中的所有小部件。

import Tkinter
import re
root=Tkinter.Tk()

E1=Tkinter.Entry(root)
E1.pack()

E2=Tkinter.Entry(root)
E2.pack()

L1=Tkinter.Label(root,text='Label1')
L1.pack()
Run Code Online (Sandbox Code Playgroud)

我遇到了 3 个问题

  1. 虽然我可以找出子部件类型,但我似乎无法在模式匹配中使用它。打印出wlist[0]以下与shell输出不同?

例如:

import Tkinter
import re
root=Tkinter.Tk()

E1=Tkinter.Entry(root)
E1.pack()

E2=Tkinter.Entry(root)
E2.pack()

L1=Tkinter.Label(root,text='Label1')
L1.pack()
Run Code Online (Sandbox Code Playgroud)
  1. 我想由于上面的打印输出和 shell 输出之间的差异,我的模式匹配不能工作?

例如

>> re.search(r'Entry',wlist[0])
    << No output >>
Run Code Online (Sandbox Code Playgroud)
  1. 假设一个人能够通过模式匹配确定一个子部件确实是一个Entry部件,你将如何让部件对象本身执行delete方法调用?

例如:

## Assuming I have a function to to clear the entry
## How would I pass the object from the pattern match in #2 to this function?
def clear_entry(objEntry):
    objEntry.delete(0,Tkinter.END)
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 11

返回的项目winfo_children()是一个小部件列表。Tkinter 小部件有一种方法可以告诉您底层小部件类:winfo_class.

>>> wlist[0].winfo_class()
'Entry'
Run Code Online (Sandbox Code Playgroud)

您还可以简单地比较对象类型,就像与任何其他 python 对象一样:

>>> isinstance(wlist[0], Tkinter.Entry)
True
Run Code Online (Sandbox Code Playgroud)

由于结果winfo_children是一个小部件列表,您可以遍历它们并清除所有条目小部件,如下所示:

for widget in root.winfo_children():
    if isinstance(widget, Tkinter.Entry):
        widget.delete(0, "end")
Run Code Online (Sandbox Code Playgroud)


小智 1

通常,您将它们存储在列表或某个容器中。

entry_list=[E1, E2]

def clear_entry():
    for id in entry_list:
        id.delete(0,Tkinter.END)
Run Code Online (Sandbox Code Playgroud)