从不同类调用函数会给出TypeError:缺少1个必需的位置参数



我试图构建一些东西,在那里我想为每个帧提供单独的类。现在,当我调用AddWidgets类的onSet函数时,它显示了一个

ERROR: TypeError: onSet() missing 1 required positional argument: 'text'

我做错了什么?如何解决这个问题?我的代码如下:

import tkinter as tk
from tkinter import ttk

class MainWindow:
def __init__(self, master):
self.master = master
self.master.title("Class Function")
self.master.wm_iconbitmap('icon.ico')
self.master.geometry("360x240+100+100")
self.frame1 = ttk.Frame(self.master)
self.frame1.grid(row=0, column=0, padx=16, pady=16)
self.frame2 = ttk.Frame(self.master)
self.frame2.grid(row=0, column=1, padx=16, pady=16)
self.add = AddWidgets(self.frame1)
self.edit = EditWidgets(self.frame2)

class AddWidgets:
def __init__(self, master):
self.master = master
self.create_widgets()
def create_widgets(self):
self.label1 = ttk.Label(self.master, text="0")
self.label1.grid(row=0, column=0, padx=4, pady=4)
def onSet(self, text):
self.label1.configure(text=text)

class EditWidgets:
def __init__(self, master):
self.master = master
self.create_widgets()
def create_widgets(self):
def onEdit():
self.send_text = self.entry_text.get()
AddWidgets.onSet(self.send_text)
self.entry_text = tk.StringVar()
self.entry1 = ttk.Entry(self.master, textvariable=self.entry_text)
self.entry1.grid(row=0, column=0, padx=4, pady=4)
self.button1 = ttk.Button(self.master, text="edit", command=onEdit)
self.button1.grid(row=0, column=1, padx=4, pady=4)

def main():
root = tk.Tk()
app = MainWindow(root)
root.mainloop()

if __name__ == '__main__':
main()

我是Python和tkinter的新手。我想建立一个桌面应用程序/软件。我想按照MVC模式来开发软件。因此,任何关于tkinter中MVC的资源以及关于如何改进我的编码、软件开发过程的建议都将不胜感激。

方法onSet需要类的实例作为第一个参数,而您只传递text参数。因此,当您调用onSet方法时,应该将AddWidgets类的实例作为第一个参数传递。您正在MainWindow类中实例化这个类:

self.add = AddWidgets(self.frame1)

因此,应该将self.add变量传递给onSet函数。为了做到这一点,你应该让你的EditWidget类接受一个额外的参数widget:

class MainWindow:
def __init__(self, master):
self.master = master
self.master.title("Class Function")
self.master.wm_iconbitmap('icon.ico')
self.master.geometry("360x240+100+100")
self.frame1 = ttk.Frame(self.master)
self.frame1.grid(row=0, column=0, padx=16, pady=16)
self.frame2 = ttk.Frame(self.master)
self.frame2.grid(row=0, column=1, padx=16, pady=16)
self.add = AddWidgets(self.frame1)
self.edit = EditWidgets(self.frame2, self.add) <--Add parameter self.add

class AddWidgets:
def __init__(self, master):
self.master = master
self.create_widgets()
def create_widgets(self):
self.label1 = ttk.Label(self.master, text="0")
self.label1.grid(row=0, column=0, padx=4, pady=4)
def onSet(self, text):
self.label1.configure(text=text)

class EditWidgets:
def __init__(self, master, widget): <-- add parameter widget 
self.master = master
self.create_widgets()
self.widget = widget
def create_widgets(self):
def onEdit():
self.send_text = self.entry_text.get()
self.widget.onSet(self.send_text) <--call onSet from widget instance
[...]

编辑:如果您想创建不同的选项卡,所有选项卡都具有相同的小部件,一种方法可以是:创建一个MainWindow类,使用Notebook类将所有选项卡添加到窗口中。

然后创建一个Add Widgets类,将所需的小部件添加到框架中。您可以在每个创建的选项卡上实例化这个类,以便用小部件填充它们。

为了获得您在每个选项卡中设置的变量的值,您可以编写一个方法getEntryValue(或任何名称(,返回条目上设置的值。类似这样的东西:

class MainWindow:
def __init__(self, master):
self.master = master
self.master.title("Class Function")
self.master.geometry("360x240+100+100")
n = ttk.Notebook(master)
self.f1 = ttk.Frame(n)   # Create first tab
self.f2 = ttk.Frame(n)   # Create second tab
n.add(self.f1, text='One')
n.add(self.f2, text='Two')     
n.pack()        
self.widget1 = AddWidgets(self.f1)
self.widget2 = AddWidgets(self.f2)

class AddWidgets:
def __init__(self, master):
self.master = master
self.create_widgets()
def create_widgets(self):
def onEdit():
send_text = self.entry_text.get()
self.label1.configure(text = send_text)
self.label1 = ttk.Label(self.master, text="0")
self.label1.grid(row=0, column=0, padx=4, pady=4)
self.entry_text = tk.StringVar()
self.entry1 = ttk.Entry(self.master, textvariable=self.entry_text)
self.entry1.grid(row=0, column=1, padx=4, pady=4)
self.button1 = ttk.Button(self.master, text="edit", command=onEdit)
self.button1.grid(row=0, column=2, padx=4, pady=4)
def getEntryText(self):
return self.entry_text.get()

希望能有所帮助。

最新更新