Python 变量类的父类是否需要是Tk实例?
我所看到的大多数示例都是在没有显式父对象的情况下实例化的(例如Python 变量类的父类是否需要是Tk实例?,python,tkinter,Python,Tkinter,我所看到的大多数示例都是在没有显式父对象的情况下实例化的(例如var=tk.StringVar()),我假设大多数其他小部件(如果不是全部)默认为当前tk实例,通常放在变量root中。这就是为什么我不确定它的父对象是否需要是一个(通常是当前的,并且是唯一的)Tk实例,或者它是否可以是任何小部件 变量类的父类是否需要是Tk实例?此外,下面类的任何属性是否有任何错误 try: import tkinter as tk except: import Tkinter as tk cl
var=tk.StringVar()
),我假设大多数其他小部件(如果不是全部)默认为当前tk
实例,通常放在变量root
中。这就是为什么我不确定它的父对象是否需要是一个(通常是当前的,并且是唯一的)Tk
实例,或者它是否可以是任何小部件
变量类的父类是否需要是Tk实例?此外,下面类的任何属性是否有任何错误
try:
import tkinter as tk
except:
import Tkinter as tk
class MyEntry(tk.Entry):
def __init__(self, master, *args, **kwargs):
tk.Entry.__init__(self, master, *args, **kwargs)
self.var1 = tk.BooleanVar(self)
# parent is exclusively the Entry widget
self.var2 = tk.DoubleVar(master)
# parent is master widget, not necessarily a Tk instance
self.var3 = tk.IntVar()
# parent is exclusively the current Tk instance, implicitly
self.var4 = tk.StringVar(self._root())
# parent is the Tk instance MyEntry object is a (grand)child of, exclusively
if __name__ == '__main__':
root = tk.Tk()
frame = tk.Frame(root)
entry = MyEntry(frame)
frame.pack()
entry.pack()
root.mainloop()
否,父实例不必是Tk实例 在上述所有类及其超类的docstring
Variable
中,有一行:
...
def __init__(self, master=None, value=None, name=None):
"""Construct a string variable.
MASTER can be given as master widget.
...
其中我假设MASTER
引用了参数MASTER
,表示MASTER可以是一个小部件,因此我假设变量类的MASTER
可以是任何小部件
我不认为任何变量类实例化都有任何问题,尽管在大多数情况下,有些可能过于显式,并且大部分是冗余的 也就是说,在提供的代码中,虽然所有这些都很好(没有
Tk
实例,小部件就不可能存在),但我相信self.var1=Tk.BooleanVar(self)
是从OOP角度实例化它的最佳结构化方式,因为它允许最包含self
的方法:
try:
import tkinter as tk
except:
import Tkinter as tk
class MyEntry(tk.Entry):
def __init__(self, master, *args, **kwargs):
tk.Entry.__init__(self, master, *args, **kwargs)
self.var1 = tk.BooleanVar(self)
if __name__ == '__main__':
root = tk.Tk()
entry = MyEntry(root)
entry.pack()
root.mainloop()
它可以是任何小部件,但除了根小部件之外,它没有任何优势。
变量
类(从中继承StringVar
等)的实现只是使用给定的主窗口来查找根窗口。根窗口是它真正关心的全部,一旦它知道根窗口,它就不会将主窗口用于其他任何事情 我的猜测是,提供的父对象是不相关的,Var只对
根对象感兴趣。它可以是任何小部件,它将具有与使用该小部件使用的Tk实例相同的效果。也就是说,好的代码只有一个Tk()实例,变量默认为该实例,因此不需要提供任何东西。内存管理如何?在上面的代码中,与其他对象相比,任何变量类对象是否会持续更长时间或导致其他类型(更高,如果有的话)的内存泄漏?