如何在 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()
我想在单击“清除”按钮时清除条目小部件中的文本。但是我得到了 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()