【问题标题】:How to call a method with self parameter on a button in python如何在python中的按钮上调用带有self参数的方法
【发布时间】:2021-10-09 19:46:34
【问题描述】:

我想在单击清除按钮时清除条目小部件中的文本。但相反,我得到 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()

操作.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()

【问题讨论】:

    标签: python tkinter inheritance methods self


    【解决方案1】:

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

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

    【讨论】:

    • 具体来说,clear 是一个接受一个参数的普通函数; self.clear 是一个绑定方法,它接受零参数,这是按钮回调所要求的。绑定的方法存储了对self和clear的引用,这样它自己就可以调用self.clear()。
    • @user14197059,我试过它说 AttributeError: 'Operations' object has no attribute 'clear'。
    • @MilindKhobragade 取消clear 和save 的代码一次。
    • @MilindKhobragade 另外我建议你看一个专注于 python 的面向对象编程教程。
    • 我认为现在应该可以使用了,对于给您带来的不便,我们深表歉意。
    【解决方案2】:

    我在编写代码时找到了解决方案。 如果有人遇到同样的问题, 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多