2015-08-15 128 views
1

我一直在试图做一个类,名为vwin它使Tk或Toplevel窗口。不幸的是它返回一个错误:Tkinter自定义类错误

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) 

回答

3

我看到很多的问题。

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

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

  3. 您从未开始使用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() 
+0

它的工作原理,非常感谢你。 –