TypeError:button_click()缺少1个必需的位置参数:“ self”

时间:2018-06-20 12:52:44

标签: python python-3.x tkinter arguments typeerror

我总是不断收到类型错误,说我缺少1个必需的位置参数,这是“自我”,我该如何解决呢?

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()

3 个答案:

答案 0 :(得分:1)

button_click方法放入类viewsome explication about self

class view():

    ...

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

答案 1 :(得分:1)

问题在这里:

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

注意命令-它说要调用button_click,并且将不带任何参数。您将点击功能定义为

def button_click(self):

因此,当您单击按钮并调用button_click 不带参数时,由于您的定义需要一个自变量-无论是因为它在类中还是出于某种原因-您都会得到错误。要么删除参数中的self

def button_click():

,或者如果它应该是类定义的一部分,则仅使用有效对象定义Button。例如,您可以放入def __init__(self)

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

还有在构造函数中构造GUI的额外好处,这是很好的设计。

答案 2 :(得分:0)

您需要将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,实际上您实际上是使用对该函数所针对的对象(类的实例)的引用叫做。如果您知道的话,就像C ++中的this

您可以阅读有关自我here的更多信息。