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.Frame
和tk.filedialog
继承是没有意义的(我怀疑这是否受支持)。您应该创建一个 tk.filedialog
的内部实例(假设确实需要)。
您甚至不需要内部实例。 tk.filedialog
是一个模块。只需将path_ = self.askdirectory()
更改为path_ = tk.filedialog.askdirectory()
并删除多重继承。
感谢大家,尤其是@Axe319,现在可以使用了!
【参考方案1】:
问题的根源在于您继承自ttk.Frame
和tk.filedialog
。这根本行不通,你不能从两者继承。您的新类不能同时是框架和对话框。
如果您希望您的 SSLCreator
类能够访问文件对话框或其方法,您只需在您的类中调用该方法。
class SSLCreator(ttk.Frame):
def __init__(self, container):
super().__init__(container)
...
def selectPath(self):
path_ = askdirectory()
self.Path.set(path_)
【讨论】:
以上是关于Python 元类冲突的主要内容,如果未能解决你的问题,请参考以下文章