如何在 python 中的按钮上调用带有 self 参数的方法

How to call a method with self parameter on a button in python

我想在单击“清除”按钮时清除条目小部件中的文本。但是我得到了 TypeError: clear() missing 1 required positional argument: 'self'。 当我单击“保存”按钮时,我想再次从条目小部件中获取文本以进行进一步计算。 请指路..

mainframe.py

from tkinter import Frame

class MainFrame(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
        
    def show(self):
        self.lift()

customer_details.py

from tkinter import Frame, Entry, StringVar
from mainframe import MainFrame

class CustomerDetails(MainFrame):
    def __init__(self, *args, **kwargs):
        MainFrame.__init__(self, *args, **kwargs)

        self.var_e = StringVar(None)

        f1 = Frame(self)
        f1.pack()

        e = Entry(f1, textvariable=self.var_e)
        e.pack()

operations.py

from tkinter import Frame, Button
from mainframe import MainFrame
from customer_details import CustomerDetails

class Operations(MainFrame):
    def __init__(self, *args, **kwargs):
        MainFrame.__init__(self, *args, **kwargs)

        def clear(self):
            self.var_e.set('')

        def save(self):
            self.var_e.get()

        f2 = Frame(self)
        f2.pack()

        b1 = Button(f2, text='Clear', command=clear) # I am unable to call clear function here.
        b1.pack()
        
        b2 = Button(f2, text='Save', command=save)
        b2.pack()

main.py

from tkinter import Tk, Frame
from customer_details import CustomerDetails
from operations import Operations

class main(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)

        f3 = Frame(self)
        f3.pack()

        customer_details_win = CustomerDetails(self)
        operations_win = Operations(self)

        customer_details_win.pack(in_ = f3)
        operations_win.pack(in_ = f3)
        
        customer_details_win.show()
        operations_win.show()
        

if __name__ == "__main__":
    root = Tk()
    app = main(root)
    app.pack()
    root.mainloop()

在operations.py中的按钮b1中,尝试将命令参数更改为self.clear。这将自动发送参数 self。 b1 = Button(f2, text = "clear", command = self.clear) 我注意到函数 clear 和 save 都在 init 中,所以如果你取消缩进它们,并将它们移动到 init[=17= 之后] 功能,它应该工作。

from mainframe import MainFrame
from customer_details import CustomerDetails

class Operations(MainFrame):
    def __init__(self, *args, **kwargs):
        MainFrame.__init__(self, *args, **kwargs)


        f2 = Frame(self)
        f2.pack()

        b1 = Button(f2, text='Clear', command=MainFrame.clear) # I am unable to call clear function here.
        b1.pack()
        
        b2 = Button(f2, text='Save', command=save)
        b2.pack()

    def clear(self):
        self.var_e.set('')

    def save(self):
        self.var_e.get()

我在编写代码时找到了解决方案。 如果有人遇到同样的问题,operation.py 的代码应该如下所示。 (如果有人想知道下面的代码到底发生了什么,请查看 OOP 中的继承教程,python)

from tkinter import Frame, Button
from mainframe import MainFrame
from customer_details import CustomerDetails

class Operations(CustomerDetails, MainFrame):
    def __init__(self, *args, **kwargs):
        MainFrame.__init__(self, *args, **kwargs)

        f2 = Frame(self)
        f2.pack()

        b1 = Button(f2, text='Clear', command=self.clear)
        b1.pack()
        
        b2 = Button(f2, text='Save', command=self.save)
        b2.pack()

    def clear(self):
        self.var_e.set('')

    def save(self):
        self.var_e.get()

由于 operation.py 中的这些更改,main.py 将相应更改。

from tkinter import Tk, Frame
from customer_details import CustomerDetails
from operations import Operations

class main(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)

        f3 = Frame(self)
        f3.pack()

        operations_win = Operations(self)
        operations_win.pack(in_ = f3)
        operations_win.show()
        
if __name__ == "__main__":
    root = Tk()
    app = main(root)
    app.pack()
    root.mainloop()