Python跨类调用函数遇Attribute not found错误求助
Python类方法调用报错解决
我正在学习Python,以下是我的代码。我想要在PresentationFunctions类中调用Rearange_files类里的move_slide_up()函数,并传入Listbox_name作为参数,但出现了attribute not found错误,恳请提供帮助。
class Rearange_files(): def move_slide_up(list_box_name): name = list_box_name index = name .curselection() if not index: return for idx in index: if idx > 0: title = name .get(idx) name .delete(idx) name .insert(idx-1, title) name .selection_set(idx-1) ###Move file names down in list box class PresentationFunctions: list_box_filename =tk.Listbox(slide_order_window, selectmode = "multiple",height=15,width list_box_filename.pack( padx=20,pady=5) """Need to call function move_slide_up(): here
问题解决步骤
1. 修复Rearange_files的方法定义
Python类里的方法必须符合语法规则:
- 若不想实例化类就调用方法,给
move_slide_up加上@staticmethod装饰器,标记为静态方法; - 若打算先创建类的实例再调用,把方法第一个参数改成
self(代表类的实例对象)。
2. 修复PresentationFunctions的语法问题
list_box_filename的定义不完整,width后面必须填写数值,还要补全右括号;- 类中的代码不能直接写在类顶层,需要放进方法里(比如
__init__初始化方法),否则会在类加载时直接执行,容易触发未定义变量等错误。
3. 正确调用move_slide_up的两种方式
方式一:静态方法调用
import tkinter as tk class Rearange_files(): @staticmethod def move_slide_up(list_box_name): name = list_box_name index = name.curselection() if not index: return for idx in index: if idx > 0: title = name.get(idx) name.delete(idx) name.insert(idx-1, title) name.selection_set(idx-1) class PresentationFunctions: def __init__(self, slide_order_window): # 补全width参数,示例设为50,可自行调整 self.list_box_filename = tk.Listbox(slide_order_window, selectmode="multiple", height=15, width=50) self.list_box_filename.pack(padx=20, pady=5) # 直接通过类名调用静态方法,传入listbox实例 Rearange_files.move_slide_up(self.list_box_filename) # 测试代码 root = tk.Tk() pf = PresentationFunctions(root) root.mainloop()
方式二:实例化类后调用实例方法
import tkinter as tk class Rearange_files(): def move_slide_up(self, list_box_name): name = list_box_name index = name.curselection() if not index: return for idx in index: if idx > 0: title = name.get(idx) name.delete(idx) name.insert(idx-1, title) name.selection_set(idx-1) class PresentationFunctions: def __init__(self, slide_order_window): self.list_box_filename = tk.Listbox(slide_order_window, selectmode="multiple", height=15, width=50) self.list_box_filename.pack(padx=20, pady=5) # 先创建Rearange_files的实例,再调用方法 rearranger = Rearange_files() rearranger.move_slide_up(self.list_box_filename) # 测试代码 root = tk.Tk() pf = PresentationFunctions(root) root.mainloop()
额外注意点
- 必须导入
tkinter模块,否则tk.Listbox会触发未定义错误; slide_order_window必须是有效的Tkinter窗口对象,比如示例中的root;- 原代码中
list_box_filename的定义不完整,一定要补全width的数值和右括号,否则连基础语法检查都无法通过。
内容的提问来源于stack exchange,提问作者Abhijith V
相关产品推荐
相关产品推荐

