TypeError: button_click () отсутствует 1 обязательный позиционный аргумент: 'self'

Я всегда получаю сообщение об ошибке типа, в котором говорится, что мне не хватает одного необходимого позиционного аргумента, который является «я», как я могу это исправить?

from tkinter import *
import tkinter
from client import*

root = tkinter.Tk()
class view():    
    root.geometry("250x300")
    F1 =Frame()
    L = Listbox(F1)
    L.grid(row=0, column =0) 

    L.pack()

    F = open("users.txt","r")
    M = F.read()
    cont = M.split()

    for each in cont:
        ind = each.find("#") + 1
        L.insert(ind+1 ,each[ind:])
        break

    F.close()

    F1.pack()

    # strng_ind = -1
def button_click(self):
        self.form.destroy()
        Chatclient().design()

button = Button(root, text = "Create Group Chat", command= button_click)

button.pack()
root.mainloop()

Должен ли button_click иметь отступ в классе?

kabanus 20.06.2018 14:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 704
3

Ответы 3

поместите метод button_click в класс view, некоторые объяснения о себе

class view():

    ...

    def button_click(self):
        self.form.destroy()
        Chatclient().design()

Проблема здесь:

button = Button(root, text = "Create Group Chat", command= button_click)

Обратите внимание на команду - она ​​требует вызвать button_click и будет без аргументов. Вы определили функцию щелчка как

def button_click(self):

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

def button_click():

или если он должен быть частью определения класса, определите Button только с допустимым объектом. Например, вы можете поместить внутрь def __init__(self):

self.button = Button(root, text = "Create Group Chat", command= self.button_click)

с дополнительным бонусом создания вашего графического интерфейса в конструкторе, что является хорошим дизайном.

Вам нужно поместить определение функции для button_click () внутри класса.

from tkinter import *
import tkinter
from client import*

root = tkinter.Tk()
class view():    
    root.geometry("250x300")
    F1 =Frame()
    L = Listbox(F1)
    L.grid(row=0, column =0) 

    L.pack()

    F = open("users.txt","r")
    M = F.read()
    cont = M.split()

    for each in cont:
        ind = each.find("#") + 1
        L.insert(ind+1 ,each[ind:])
        break

    F.close()

    F1.pack()

    # strng_ind = -1
    def button_click(self):
        self.form.destroy()
        Chatclient().design()

button = Button(root, text = "Create Group Chat", command= button_click)

button.pack()
root.mainloop()

По сути, вам нужно сделать отступ в коде для определения функции.

Фактически, когда вы помещаете код для функции внутри класса, он становится функцией-членом для этого класса и, передавая аргумент self, вы просто фактически используете ссылку на объект (экземпляр класса), для которого вызывается эта функция. Это как this в C++, если вы об этом знаете.

Вы можете узнать больше о себе здесь.

Другие вопросы по теме