On 6/14/2018 1:20 AM, Christian Gollwitzer wrote:
Am 14.06.18 um 05:14 schrieb huey.y.ji...@gmail.com:
root = Tkinter.Tk()
button = Tkinter.Button(root, text="Find me")
button.pack()

I created a button, Python object. I recall I can check this object existing by using   winfo, such as  winfo.exists(button). However, I forgot which super class contains this   winfo   method.  I printed out dir(os), dir(sys), dir(Tkinter), but did not find this winfo method. I wonder who will be kindly drop down a few lines?
This is due to a bad wrapping of the original Tcl interface of Tk. In the original Tcl, "winfo" is not a method of anything, it is a free function. In TkInter, all free functions that accept a widget as the first parameter were made methods of that widget.

They were made methods of all widgets. Thanks for pointing this out, as it same some anomalies more understandable.

Someone was overcome with Java-esque OO-itis, the notion that all function have to be methods.
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.html
calls them universal methods. The result is that help(Text), for instance, returns over 1000 lines because it includes all the universal methods in addition to the real Text methods. dir(Text(root)) is also overburdened with non-Text information.

Therefore, "winfo_exists" is a method of "button", which is logically contorted: you are asking an object "do you exist?".

You are actually asking the python instance whether the tk window it initially represented still exists. In tk, the argument is a window name that represents a window structure. Does the structure initially represented by a name still exist?

This is similar to a python file instance myfile existing after the corresponding OS file has been closed (destroyed) with myfile.close. This sets the attribute myfile.closed to True. Calling other file methods fails because there is no OS structure to relay it to.

However, since it can be explicitly destroyed, this can still be useful:

 >>> import Tkinter
 >>> root = Tkinter.Tk()
 >>> button = Tkinter.Button(root, text="Find me")
 >>> button.pack()
 >>> button.winfo_exists()
1
 >>> button.destroy()
 >>> button.winfo_exists()
0

I am not sure that this is very helpful, though. Usually you don't destroy a button yourself, it is done by the destructor when the button is deleted, and therefore, winfo_exists() under normal circumstances returns true.

The reference above omits winfo-exists, perhaps because it is so useless.

--
Terry Jan Reedy


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to