Вызов функции из другого класса дает TypeError: отсутствует 1 обязательный позиционный аргумент - PullRequest
0 голосов
/ 03 декабря 2018

Я пытался создать что-то, где я хотел бы дать отдельный класс для каждого кадра.Теперь, когда я вызвал функцию onSet класса 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.Поэтому любые ресурсы для MVC в tkinter и предложения о том, как я могу улучшить свое кодирование, процесс разработки программного обеспечения будут оценены.

1 Ответ

0 голосов
/ 03 декабря 2018

Метод 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()

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...