【问题标题】:How do you resolve this python tkinter error?你如何解决这个 python tkinter 错误?
【发布时间】:2021-10-09 21:46:25
【问题描述】:
import tkinter as tk

class Calculator(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master.geometry("300x800")
        self.master.title("GUI Calculator")
        self.pack()

    # CREATE BUTTONS IN A FOR LOOP.
    btnclrs = ["Blue", "Red", "Green", "Red", "Green", "Blue", "Red", "Green", 
"Blue"]
    self.btns = []
    for i in range(9):
        def callback(self=self, var=i+1):
            self.text.insert(tk.END, var)
            self.text.pack()
        button = tk.Button(text=i+1, fg=btnclrs[i], bg="Black", command=callback)
        button.pack()
        self.btns.append(button)

    self.text = tk.Text(self.master)
    self.text.bind("<Key-Return>", self.calculation)  # DON'T CALL FUNCTION WHEN BINDING.
    self.text.pack()
    self.text.focus_set()  # ADDED SO BOUND EVENT-HANDLERS WILL BE CALLED.


    operations = ["+", "-", "*", "/"]
    self.ops = []

    for i in range(4):
        def callback1(self=self, var=operations[i]):
            self.text.insert(tk.END, var)
            self.text.pack()
        buttono = tk.Button(text=operations[i], fg="Black", bg="Black", command=callback1)
        buttono.pack()
        self.ops.append(buttono)

    self.output = tk.Text(self.master)
    self.output.insert(1.0, "Output: \n")
    self.output.pack()
    self.master.mainloop()


def calculation(self, event = None):
    out = self.text.get('1.0', 'end')
    output1 = eval(out)
    self.output.delete(1.0, tk.END)
    self.output.insert(1.0, output1)

calc_button = tk.Button(text = "Calculate", fg = "Blue", bg = "White", command = calculation)
calc_button.pack()

if __name__ == "__main__":
    Calculator()

我已经完成了这个计算器的所有逻辑的编码,我只想创建一个“计算”可视按钮供用户按下。它导致以下错误:

Tkinter 回调异常 回溯(最近一次通话最后): call 中的文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/init.py”,第 1883 行 返回 self.func(*args) TypeError:calculation() 缺少 1 个必需的位置参数:'self'

为什么会这样?

【问题讨论】:

  • calculation中删除“self”参数。
  • 您的代码运行失败。修复代码的缩进问题。

标签: python tkinter


【解决方案1】:

如果你在类之外定义一个函数,它不应该使用self 参数。但是,您的calculation 实现需要self,因此您需要在类中定义方法。

class Calculator(tk.Frame):
    def __init__(self, master=None):
        ...
    def calculation(self, event = None)
        ...

接下来,您需要从Calculator 的实例调用calculation。为此,您必须在创建使用实例的按钮之前创建实例:

if __name__ == "__main__":
    calc = Calculator()
    calc_button = tk.Button(..., command = calc.calculation)
    calc_button.pack()

此外,作为最佳做法,您应该Calculation 内部调用self.pack。几何管理器(packplacegrid)通常应在创建小部件的同一上下文中调用。

if __name__ == "__main__":
    calc = Calculator()
    calc_button = tk.Button(..., command = calc.calculation)
    calc.pack(side="top", fill="both", expand=True)
    calc_button.pack(side="bottom")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多