如何用OOP重写Tkinter循环按钮的Lambda方法?遇self参数缺失报错
问题解决:OOP代码错误修复
错误原因
出现missing 1 required positional argument: 'self'是因为直接通过类名调用了实例方法COPY.create_button()——实例方法必须通过类的实例调用,不能直接用类名触发。此外代码还有两处问题:
- lambda表达式语法错误,参数绑定写法不符合Python规范
btn_copy_function中引用的button_copy是局部变量,方法内部无法访问该变量
修正后的OOP代码
import pyperclip as pycopy import tkinter as tk tk_win = tk.Tk() tk_text = tk.Text(tk_win) tk_text.pack() # 需添加布局控件才能显示文本框 list_text = ["a", "b", "c"] class CopyHandler: def btn_copy_function(self, text, button): pycopy.copy(text) button['text'] = "copied" def create_buttons(self): for el in list_text: button_copy = tk.Button(tk_win, text="tick to copy") # 绑定当前元素与按钮到回调,避免循环变量引用问题 button_copy.config(command=lambda t=el, btn=button_copy: self.btn_copy_function(t, btn)) tk_text.window_create(tk.INSERT, window=button_copy) tk_text.insert(tk.INSERT, "\n") # 实例化类后调用方法 handler = CopyHandler() handler.create_buttons() tk_win.mainloop()
非OOP实现方案
完全可以不用OOP,用闭包结合lambda绑定参数就能实现需求:
import pyperclip as pycopy import tkinter as tk tk_win = tk.Tk() tk_text = tk.Text(tk_win) tk_text.pack() list_text = ["a", "b", "c"] def create_buttons(): for el in list_text: def copy_func(text, btn): pycopy.copy(text) btn['text'] = "copied" button_copy = tk.Button(tk_win, text="tick to copy") # 绑定当前循环的元素和按钮,注意用默认参数捕获当前值 button_copy.config(command=lambda t=el, btn=button_copy: copy_func(t, btn)) tk_text.window_create(tk.INSERT, window=button_copy) tk_text.insert(tk.INSERT, "\n") create_buttons() tk_win.mainloop()
内容的提问来源于stack exchange,提问作者TYK
相关产品推荐
相关产品推荐

