Getting Python Tkinter Object Type

2019-03-01 01:04发布

问题:

I am currently working on a program which handles a number of different possible entry widgets in a Python program.

I need some code to be able to determine what type of widget a particular object is, for example Entry or Checkbutton.

I have tried using the type(var) method to no avail (I get the error missing required variable self) as well as the var.__class__ and I am making no progress.

for d in dataTypes:
    if isinstance(d, Entry):
        print("Found Entry!")
    elif type(d).__name__ == 'Checkbutton':
        print("Found Checkbox!")

Does anyone have any idea of how I can solve this?

回答1:

If you need the name as a string, you can use the .winfo_class() method:

for d in dataTypes:
    if d.winfo_class() == 'Entry':
        print("Found Entry!")
    elif d.winfo_class() == 'Checkbutton':
        print("Found Checkbutton!")

Or, you could access the __name__ attribute:

for d in dataTypes:
    if d.__name__ == 'Entry':
        print("Found Entry!")
    elif d.__name__ == 'Checkbutton':
        print("Found Checkbutton!")

That said, using isinstance is a more common/pythonic approach:

for d in dataTypes:
    if isinstance(d, Entry):
        print("Found Entry!")
    elif isinstance(d, Checkbutton):
        print("Found Checkbutton!")

Also, your current code is failing because type(d).__name__ does not return what you think it does:

>>> from tkinter import Checkbutton
>>> type(Checkbutton).__name__
'type'
>>>

Notice that it returns the name of the type object returned by type, not the name of Checkbutton.