Python 元类冲突

Posted

技术标签:

【中文标题】Python 元类冲突【英文标题】:Python Metaclass conflict 【发布时间】:2022-01-12 15:09:34 【问题描述】:

我想要一个使用我的 selectpath 函数的按钮,但我不知道如何让它在类中工作。 非常感谢任何帮助!

当我执行它时,我总是得到这个错误。

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

import xlsxwriter
import os
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showerror
from tkinter.filedialog import askdirectory


class SSLCreator(ttk.Frame, tk.filedialog):
   def __init__(self, container):
       super().__init__(container)
       # field options
       options = 'padx': 5, 'pady': 5

       # selectPath label
       self.selectPath_label = ttk.Label(self, text='Ordner')
       self.selectPath_label.grid(column=0, row=0, sticky=tk.W, **options)
       self.Path = tk.StringVar()

       # selectPath entry
       self.selectPath_entry = ttk.Entry(self, textvariable=self.selectPath)
       self.selectPath_entry.grid(column=1, row=0, **options)
       self.selectPath_entry.focus()

       # selectPath button
       self.selectPath_button = ttk.Button(self, text='Öffnen')
       self.selectPath_button['command'] = self.selectPath
       self.selectPath_button.grid(column=2, row=0, sticky=tk.W, **options)



       # seperator label
       self.seperator_label = ttk.Label(self, text='Seperator')
       self.seperator_label.grid(column=0, row=1, sticky=tk.W, **options)
       self.seperator = tk.StringVar()

       # seperator entry
       self.seperator_entry = ttk.Entry(self, textvariable=self.seperator)
       self.seperator_entry.grid(column=1, row=1, **options)
       self.seperator_entry.focus()

       #self.convert_button = ttk.Button(self, text='Convert')
       #self.convert_button['command'] = self.convert
       #self.convert_button.grid(column=2, row=2, sticky=tk.W, **options)


       # result label
       self.result_label = ttk.Label(self)
       self.result_label.grid(row=2, columnspan=3, **options)

       # add padding to the frame and show it
       self.grid(padx=10, pady=10, sticky=tk.NSEW)

   def selectPath(self):
       path_ = self.askdirectory()
       self.Path.set(path_)


class App(tk.Tk):
   def __init__(self):
       super().__init__()
       self.iconbitmap("C:\\Users\\Michael\\Desktop\\icon.ico")
       self.title('SSL Creator')
       self.geometry('300x110')
       self.resizable(False, False)


if __name__ == "__main__":
   app = App()
   SSLCreator(app)
   app.mainloop()
 

【问题讨论】:

你甚至不应该得到一个按钮;一旦 Python 尝试执行 class 语句,我就会收到错误消息。 你是对的...... ttk.Frametk.filedialog 继承是没有意义的(我怀疑这是否受支持)。您应该创建一个 tk.filedialog 的内部实例(假设确实需要)。 您甚至不需要内部实例。 tk.filedialog 是一个模块。只需将path_ = self.askdirectory() 更改为path_ = tk.filedialog.askdirectory() 并删除多重继承。 感谢大家,尤其是@Axe319,现在可以使用了! 【参考方案1】:

问题的根源在于您继承自ttk.Frametk.filedialog。这根本行不通,你不能从两者继承。您的新类不能同时是框架和对话框。

如果您希望您的 SSLCreator 类能够访问文件对话框或其方法,您只需在您的类中调用该方法。

class SSLCreator(ttk.Frame):
   def __init__(self, container):
       super().__init__(container)
       ...

   def selectPath(self):
       path_ = askdirectory()
       self.Path.set(path_)

【讨论】:

以上是关于Python 元类冲突的主要内容,如果未能解决你的问题,请参考以下文章

解决 enum34 元类冲突?

为啥具有对象基础的元类会引发元类冲突?

flask-classy 和 peewee,元类冲突错误

元类冲突、多重继承、实例为父

TypeError:元类冲突:派生类的元类

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