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

时间:2016-01-08 00:38:31

标签: 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()

我遇到了3个问题

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

    >> wlist=root.winfo_children()
    >> wlist
    [<Tkinter.Entry instance at 0x00000000151911C8>,
     <Tkinter.Entry instance at 0x00000000151BAD88>,
     <Tkinter.Label instance at 0x00000000151B29C8>]
    
    >> wlist[0]    # shell output
    <Tkinter.Entry instance at 0x00000000151911C8>
    
    >> print wlist[0]   # print output here is different vs shell output above
    .353964488L
    
    1. 我认为由于打印输出和打印输出之间的差异。 shell输出上面,我的模式匹配不起作用?
    2. 例如

      >> re.search(r'Entry',wlist[0])
          << No output >>
      
      1. 假设有人能够通过模式匹配确定子窗口小部件确实是Entry窗口小部件,那么如何让窗口小部件对象本身执行delete方法调用?
      2. 例如:

        ## 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)
        

3 个答案:

答案 0 :(得分:3)

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

>>> wlist[0].winfo_class()
'Entry'

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

>>> isinstance(wlist[0], Tkinter.Entry)
True

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

for widget in root.winfo_children():
    if isinstance(widget, Tkinter.Entry):
        widget.delete(0, "end")

答案 1 :(得分:1)

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

entry_list=[E1, E2]

def clear_entry():
    for id in entry_list:
        id.delete(0,Tkinter.END)

答案 2 :(得分:0)

您可以使用

查看typu
if type(wlist[0]) == Tkinter.Entry:  # True/False

或更好

if isinstance(wlist[0], Tkinter.Entry): # True/False

wlist[0]是对象,所以你可以做到

wlist[0].delete(0,Tkinter.END)

clear_entry(wlist[0])

当您尝试打印对象时,使用str()将对象转换为字符串

print str(wlist[0])

.353964488L

shell使用repr()将对象转换为字符串

print repr(wlist[0])

<Tkinter.Entry instance at 0x00000000151911C8>