类型错误:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类。

5

我正在尝试使用类创建GUI,但一直遇到这个错误。我不确定它的意思,因为就我所看到的,我只有一个类,我的错误是:

Traceback (most recent call last):
File "C:/Users/Blaine/Desktop/Computing Project.py", line 5, in <module>
class SneakerSeeker(tk,Frame):
TypeError: metaclass conflict: the metaclass of a derived class must be a 
(non-strict) subclass of the metaclasses of all its bases

我的代码如下:

from tkinter import * 
import tkinter as tk
import tkinter.messagebox as tm

class Number1(tk,Frame):
    def __init__(self, master):
        super(Number1, self).__init__()
        self.master = master
        self.frame = tk.Frame(self.master)
        self.TopTitle = Label("Number1", font = ('Calibri ', 16))
        self.TopTitle.pack()


def main():
    root = tk.Tk()
    root.title("Number 1")
    app = Number1(root)
    root.mainloop()

if __name__ == '__main__':
    main()
1个回答

4

我想评论一下你的代码,但有许多需要指出的问题:

  • 首先,应该摆脱 from tkinter import * 这种写法,改为 import tkinter as tk(正如Bryan在这里多次强调的)。此外,为什么要在同一个应用程序中编写 from tkinter import *import tkinter as tk?这样做会导致所有小部件类都必须以 tk 为前缀(例如:tk.Label(...)tk.Frame(...) 等)。

  • class Number1(tk,Frame) 中,应该写成 tk.Frame(或者如果保留原来的导入方式,则可以简写为 Frame)。

  • super(Number1, self).__init__() 中,不必要地使用了 super()。请阅读Bryan在这里的答案:Best way to structure a tkinter application,并将该行替换为以下代码:tk.Frame.__init__(self, master)(未来,请考虑一下Python's Super is nifty, but you can't use it)。

  • 关于这一行代码:self.TopTitle = Label("Number1", font = ('Calibri ', 16)):传递给 tk.Label()(以及任何其他小部件)的第一个选项是父小部件,在你的情况下是 self.master

  • 我认为与 self.TopTitle 相关的两行代码是无用的,我不明白你试图通过它们实现什么目的(此外,你不应该这样命名标签;如果想加入Python阵营,请遵守PEP 8)。


1
什么?使用 super 没有任何问题。事实上,它比 tk.Frame.__init__ 更好,因为您不必硬编码父类的名称。 - Aran-Fey
2
也许值得一提的是,错误信息与第二段有关,可能是一个笔误 tk,Frame 而不是 tk.Frame - smido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接