代码之家  ›  专栏  ›  技术社区  ›  Partho63 BASANT KUMAR

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

  •  0
  • Partho63 BASANT KUMAR  · 技术社区  · 7 年前

    我试图构建一些东西,我想给每一帧单独的类。现在,当我调用AddWidgets类的开始函数时,它显示了一个

    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 回复  |  直到 7 年前
        1
  •  1
  •   toti08    7 年前

    方法 onSet 需要类的实例作为第一个参数,而您只传递 text 论点所以当你打电话给你的 AddWidgets 类作为第一个参数。 MainWindow 类别:

    self.add = AddWidgets(self.frame1)
    

    所以你应该通过考试 self.add 开端 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
    [...]
    

    如果您想创建不同的选项卡,所有选项卡都使用相同的小部件,一种方法可以是:创建一个 主窗口 类,您可以在其中使用 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()