Python 3: требуемый позиционный аргумент - PullRequest
0 голосов
/ 06 июня 2018

Я делаю программу и обнаружил ошибку.Поэтому в моей программе вы можете создавать кнопки, которые выполняют простую функцию, меняют цвета.После создания кнопки ее текст сохраняется в файле .dat, а после загрузки он создает кнопку с текстом, сохраненным в файле.

Кнопка создается, но при попытке изменить ееcolor он посылает мне ошибку:

TypeError: changecolor() missing 1 required positional argument: 'self'

Я видел другие посты, в которых говорилось, что ответом было создание экземпляра функции, например:

class F:
      define c:
             print("1")
      define a:
             print("3")

f = F
f.c

Но если я попытаюсь это сделатьЯ получаю еще одну ошибку:

__init__() missing 3 required positional arguments: 'MainWindow', 'color', and 'text'

И я уже перепробовал все, чтобы исправить эту ошибку, поэтому я предполагаю создать экземпляр класса и попытаться добавить требуемые позиционные аргументы - не вариант.

Итак, как я могу это исправить?Если вы решили проблему, скажите, пожалуйста, как это сделать.

Вот код для загрузки файла с текстом:

class LoadButtons:
    def _init_(self):
        global console
        self.instance=console

    def LoadButton(self):
        global lnumber, path, name, p
        if os.path.isfile("%s\BI\Button%s.dat" %(path, lnumber)):
            print("Button%s found!" %(lnumber))
            name = pickle.load(open("%s\BI\Button%s.dat" %(path, lnumber), 'rb'))
            console = Button(MainWindow, text=name,bg = "#E6E6E6", command=needed_but.changecolor())
            console.pack()
            LoadButtons()._init_()
            lnumber += 1
            LoadButtons().LoadButton()
        else:
            lnumber = 0

А вот код для того, чтобы кнопки меняли цвета:

class needed_but:
    def __init__(self,MainWindow,color,text):
        console = Button(MainWindow, text=text,bg=color, command=self.changecolor)
        console.pack()
        self.instance=console

    def changecolor(self):
        buttonred,buttongreen,buttonblue=get_color()
        global clicked,misses_dict,dictionary
        #clicked=True
        #global buttoncolor
        if buttonred == True:
            if os.path.exists("%s\SI" %(path)):
                self.instance.configure(bg = "#ff0000")
                dun = self.instance.cget('text')
                print(dun)
                if dun in misses_dict:
                    misses_dict[('%s' %(dun))] += 1
                else:
                    misses_dict[('%s' %(dun))] = 1
                dictionary = misses_dict
                pickle.dump(dictionary, open("%s\SI\SIA.dat" %(path), 'wb'))
                print(misses_dict)
                buttonred = False
            else:
                print("ATTENTION: The SI Folder was not found, Please Create a folder with the name SI\nIf you don't create the folder, then you will not be able to use this program")
        elif buttongreen == True:
            self.instance.configure(bg = "#00ff00")
        elif buttonblue == True:
            self.instance.configure(bg = "#2e9afe")

Спасибо!

1 Ответ

0 голосов
/ 06 июня 2018

Вы вызвали метод экземпляра как метод класса.changecolor должен вызываться через экземпляр needed_but, объект self, с которым вы собираетесь работать.Например:

but = needed_but()
but.changecolor()

Поскольку вы еще не создали ни одного такого объекта, я не совсем уверен, что вы ожидаете сделать с этим вызовом.


ОБНОВЛЕНИЕ

Вот ваша текущая проблема:

class needed_but:
    def __init__(self, MainWindow, color, text):

против

but = needed_but()

В соответствии с вашим методом инициализации, вы должны предоставить все трииз перечисленных значений для создания объекта.Ваша реализация из основного кода не предоставляет ничего - только неявная self реализации.

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