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)
我看到很多问题。
在您的自定义 class 中,您只是创建 Tk()
对象并将其分配给局部变量 window
,该变量的作用域一旦 [=13] =] 函数结束,并且很可能被垃圾收集。您应该将 Tk()
对象保存为实例变量。
您正在将 vwin
类型的对象作为主对象发送给 Sub window
vwin 构造函数。然后你试图在 vwin
对象上调用 Toplevel()
,这是行不通的。您需要在那里使用之前保存的 Tk()
对象。
你永远不会为 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()
我一直在尝试制作一个名为 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)
我看到很多问题。
在您的自定义 class 中,您只是创建
Tk()
对象并将其分配给局部变量window
,该变量的作用域一旦 [=13] =] 函数结束,并且很可能被垃圾收集。您应该将Tk()
对象保存为实例变量。您正在将
vwin
类型的对象作为主对象发送给Sub window
vwin 构造函数。然后你试图在vwin
对象上调用Toplevel()
,这是行不通的。您需要在那里使用之前保存的Tk()
对象。你永远不会为
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()