Tkinter自定义类

2024-03-29 12:18:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

Tags: inpyselfmasterinittkinterlineargs
1条回答
网友
1楼 · 发布于 2024-03-29 12:18:00

我看到很多问题。你知道吗

  1. 在您的自定义类中,您只需创建Tk()对象并将其赋给局部变量window,该变量的作用域在__init__()函数结束时结束,并且很可能被垃圾收集。应该将Tk()对象保存为实例变量。

  2. 您正在将类型为vwin的对象作为主对象发送给Sub windowvwin构造函数。然后您试图调用Toplevel()对象上的vwin,这将不起作用。您需要在那里使用先前保存的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()

相关问题 更多 >