2015-08-15 158 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

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