Tkinter 自定义 class 错误

Tkinter custom class error

我一直在尝试制作一个名为 vwin 的 class,它可以制作 Tk 或 Toplevel window。不幸的是 returns 一个错误:

Traceback (most recent call last):
  File "C:\Users\RELIC\Desktop\textpad.py", line 17, in <module>
    sub = vwin(['Sub Window','640x480-25-25','normal','window'],root)
  File "C:\Users\RELIC\Desktop\textpad.py", line 9, in __init__
    window = Toplevel(master)
  File "C:\Python33\lib\tkinter\__init__.py", line 2136, in __init__
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
  File "C:\Python33\lib\tkinter\__init__.py", line 2086, in __init__
    BaseWidget._setup(self, master, cnf)
  File "C:\Python33\lib\tkinter\__init__.py", line 2064, in _setup
    self.tk = master.tk
AttributeError: 'vwin' object has no attribute 'tk'

这是我的代码:

###############################################################################
from tkinter import *

class vwin():
    def __init__(self,args,master=None):
        if args[3].lower() == 'tk':
            window = Tk()
        else:
            window = Toplevel(master)
        window.title(args[0])
        window.geometry(args[1])
        window.state(args[2])



root = vwin(['Main Window','640x480+25+25','normal','Tk'])
sub = vwin(['Sub Window','640x480-25-25','normal','window'],root)

我看到很多问题。

  1. 在您的自定义 class 中,您只是创建 Tk() 对象并将其分配给局部变量 window,该变量的作用域一旦 [=13] =] 函数结束,并且很可能被垃圾收集。您应该将 Tk() 对象保存为实例变量。

  2. 您正在将 vwin 类型的对象作为主对象发送给 Sub window vwin 构造函数。然后你试图在 vwin 对象上调用 Toplevel(),这是行不通的。您需要在那里使用之前保存的 Tk() 对象。

  3. 你永远不会为 Tk() 启动 mainloop() 所以当你 运行 程序作为脚本时,它会在开始之前结束。

我认为可能有很多更好的方法来做到这一点,但让它为您工作的一种方法是 -

from tkinter import *

class vwin():
    def __init__(self,args,master=None):
        if args[3].lower() == 'tk':
            self.window = Tk()
        else:
            self.window = Toplevel(master.window)
        self.window.title(args[0])
        self.window.geometry(args[1])
        self.window.state(args[2])

    def mainloop(self):
        self.window.mainloop()



root = vwin(['Main Window','640x480+25+25','normal','Tk'])
sub = vwin(['Sub Window','640x480-25-25','normal','window'],root)
root.mainloop()