如何为 TKINTER 中的条目总和定位 def

Posted

技术标签:

【中文标题】如何为 TKINTER 中的条目总和定位 def【英文标题】:How to position a def for a sum of entries in TKINTER 【发布时间】:2020-01-13 19:26:08 【问题描述】:

我试图在按下按钮 b1 后得到 t1 和 t2 的总和。但是,我无法弄清楚 def sum(self) 的位置:因为它当前位于代码中,所以我收到错误 TypeError: sum() missing 1 required positional argument: 'self' after input in t1 and t2 then press b1。

from tkinter import *
import tkinter as tk


class Example(tk.Frame):
    def __init__(self, root):

        tk.Frame.__init__(self, root)
        self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
        root.geometry("1000x500")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4,4), window=self.frame, anchor="nw",
                                  tags="self.frame")


        self.populate()


    def populate(self):
        l1=Label(self.frame,text="First Number")
        l1.grid(row=0,column=0)
        t1=Entry(self.frame)
        t1.grid(row=0,column=1)
        l2=Label(self.frame,text="Second Number")
        l2.grid(row=1,column=0)
        t2=Entry(self.frame)
        t2.grid(row=1,column=1)
        l3=Label(self.frame,text="Result")
        l3.grid(row=2,column=0)
        t3=Entry(self.frame)
        t3.grid(row=2,column=1)
        b1=Button(self.frame,text="Click For SUM",command=sum)
        b1.grid(row=3,column=1)


def onFrameConfigure(self, event):
    '''Reset the scroll region to encompass the inner frame'''
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))


def sum(self):
    a=int(self.t1.get())
    b=int(self.t2.get())
    c=a+b
    self.t3.insert(0,c)


if __name__ == "__main__":
    root=tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)

    root.mainloop()

【问题讨论】:

您可以非常简单地完成它。你这样做的方式比它应该的更复杂 【参考方案1】:

函数需要参数self。在 python 中,类方法(除非用@staticmethod 显式修饰)自动传递self(调用函数的对象)作为第一个参数。

您的第一个问题是缩进: sum(self) 没有缩进,因此不会被解释为 Example 类的方法,onFrameConfigure 也不是;您需要将这两个缩进与 populate() 处于相同的缩进级别

即使你解决了这个问题,你也会遇到另一个问题:populate(self)中创建变量的时候还需要给类赋值,否则它们只会存在于那个函数的作用域中,你就没有访问它们的好方法。您还需要更改命令。由于您正在调用一个方法,因此您需要声明适当的命名空间(self):

    def populate(self):
        self.l1=Label(self.frame,text="First Number")
        self.l1.grid(row=0,column=0)
        ...
        self.b1=Button(self.frame,text="Click For SUM", command=self.sum)
        self.b1.grid(row=3,column=1)

【讨论】:

谢谢丹尼尔。我犯了但仍然显示此错误:TypeError: sum() take at least 1 positional argument (0 given) 您还需要更改分配给 b1 的命令。类的成员函数由 self.fn() 调用,而不是 fn()。所以当你创建命令的时候,应该是self.sum 我想通了。我有 command=sum 而不是 command=self.sum。 再次感谢您的帮助!一旦我得到 15 分,我会回来支持你的回复。 @MelanieLauzon 如果它解决了您的问题,无论您的声誉如何,您仍然可以接受答案。

以上是关于如何为 TKINTER 中的条目总和定位 def的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tkinter GUI 位于同一文件中的情况下运行 python 脚本?您如何处理用户条目?

SQL Server:如何为同一张表中的不同客户获取 3 天内的滚动总和

如何为 pygame 创建这个 tkinter 菜单栏

tkinter - 如何为文本设置字体?

Tkinter:如何为画布矩形的轮廓着色?

如何为标签列表制作“滚动条”? python tkinter [复制]