首页 > 解决方案 > 方法需要自我论证

问题描述

我在这里有这段代码,它是关于一个带有 Tkinter 的 GUI 应用程序,非常简单,但是有一个错误我无法在不破坏代码的情况下解决:

import tkinter as tk

class Sistema:

    def __init__(self, g1 = 0, g2 = 0, g3 = 0, g4 = 0, media = 6):
        self.g1 = g1
        self.g2 = g2
        self.g3 = g3
        self.g4 = g4
        self.media = media
        resultCalc = (self.g1 + self.g2 + self.g3 + self.g4) / 4
        self.resultCalc = resultCalc


        Label_reply['text'] = Sistema.__str__()
    def __str__(self):

        if self.resultCalc < self.media:
            return "Você não passou de ano! ╰(‵□′)╯"
        elif self.resultCalc > self.media:
            return "Você passou de ano!(~ ̄▽ ̄)~"
        elif self.resultCalc == self.media:
            return "Você passou de ano! Essa foi por pouco (。_。)"
        else:
            return "Erro fatal (╬▔皿▔)╯"


root = tk.Tk()

canvas = tk.Canvas(root, bg = "#159BA0", height = 500, width = 500)
canvas.pack()

Label1 = tk.Label(canvas, text = "Digite sua nota:")
Label1.place(x = 10,y = 10)
Entry1 = tk.Entry(canvas)
Entry1.place(x = 100,y = 10)

Label2 = tk.Label(canvas, text = "Digite sua nota:")
Label2.place(x = 10,y = 50)
Entry2 = tk.Entry(canvas)
Entry2.place(x = 100,y = 50)

Label3 = tk.Label(canvas, text = "Digite sua nota:")
Label3.place(x = 10, y = 90)
Entry3 = tk.Entry(canvas)
Entry3.place(x = 100, y = 90)

Label4 = tk.Label(canvas, text = "Digite sua nota:" )
Label4.place(x = 10, y = 130)
Entry4 = tk.Entry(canvas)
Entry4.place(x = 100, y = 130)

Label5 = tk.Label(canvas, text = "Média mínima: ")
Label5.place(x=10, y = 170)
Entry5 = tk.Entry(canvas)
Entry5.place(x=100, y = 170)

Button1 = tk.Button(canvas, text = "Enviar",
command = lambda : Sistema(float(Entry1.get()), float(Entry2.get()), float(Entry3.get()), float(Entry4.get()), 
float(Entry5.get())))
Button1.place(x = 10, y = 210)

Label_reply = tk.Label(canvas)
Label_reply.place(x = 10, y = 240)

root.mainloop()

但是,当我运行它时,它会引发这个异常:

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

错误在第 15 行。我知道这意味着什么以及为什么会发生,但是我找不到在不破坏代码的情况下解决它的方法,有人可以帮助我吗?

标签: pythonclassoopcanvastkinter

解决方案


考虑这行代码:

Label_reply['text'] = Sistema.__str__()

您是在而不是类的实例__str__上调用该方法。这就是它要求参数的原因。self

我假设你想调用__str__当前对象的方法,你可以通过调用str(self)

Label_reply['text'] = str(self)

推荐阅读