1

我一直在尝试创建一个名为vwin的类,它可以创建 Tk 或 Toplevel 窗口。不幸的是,它返回一个错误:

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

1 回答 1

3

我看到很多问题。

  1. 在您的自定义类中,您只是创建Tk()对象并将其分配给局部变量window,其范围在__init__()函数结束后结束,并且很可能是垃圾收集。您应该将Tk()对象保存为实例变量。

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

  3. 您永远不会启动 mainloop() ,Tk()因此当您将程序作为脚本运行时,它会在启动之前结束。

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

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()
于 2015-08-15T16:53:36.303 回答