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

时间:2018-12-03 07:29:37

标签: python tkinter

我正在尝试构建一些东西,我想为每个框架提供单独的类。现在,当我调用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的任何资源以及有关如何改进编码,软件开发过程的建议,将不胜感激。

1 个答案:

答案 0 :(得分:1)

方法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类将所有选项卡添加到窗口中。 / p>

然后,您创建一个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()

希望有帮助。