Python如何更新类成员?Form类filename赋值后仍为None问题咨询
问题解答
你的理解是对的
用self.filename确实会将它定义为类的成员变量,而非方法的局部变量,这个理解完全没问题。
为什么print出来还是None?
问题出在代码的执行顺序上:
- 你在
__init__里先初始化self.filename = None,创建按钮后立刻执行了print(self.filename),这时候按钮还没被点击,select_file()方法根本没运行过,self.filename自然还是初始的None。 - 之后调用
root.mainloop()启动GUI事件循环,程序会停在这里等待用户操作,但这时候之前的print语句早已经执行完毕了。
怎么验证值已经被保留?
你可以修改代码,在select_file里打印值,或者新增一个按钮来查看当前的filename:
import tkinter as tk from tkinter import ttk, filedialog as fd class Form: def select_file(self): filetypes = [('MP3', '*.mp3'), ('WAV', '*.wav')] self.filename = fd.askopenfilename(filetypes=filetypes) # 选中文件后直接打印验证 print(f"选中的文件路径:{self.filename}") def show_filename(self): # 新增方法,用来查看当前filename的值 print(f"当前filename的值:{self.filename}") def __init__(self): self.filename = None root = tk.Tk() root.title("test") root.geometry('600x400') open_btn = ttk.Button( root, text='Open', command=self.select_file) open_btn.place(x=260, y=150) # 新增查看按钮 show_btn = ttk.Button( root, text='查看选中路径', command=self.show_filename) show_btn.place(x=240, y=230) root.mainloop() if __name__ == "__main__": app = Form() # 程序退出后(关闭窗口),可以在这里获取最终的filename print(f"程序结束时的filename:{app.filename}")
关于传递给Controller类
只要你的Form实例没有被销毁,在Controller类里直接通过实例的filename属性就能获取到最新值,比如:
class Controller: def __init__(self, form_instance): self.form = form_instance def use_filename(self): if self.form.filename: print(f"Controller获取到的文件路径:{self.form.filename}") else: print("还没选中文件") # 使用示例 if __name__ == "__main__": app = Form() ctrl = Controller(app) ctrl.use_filename()
内容的提问来源于stack exchange,提问作者agn
相关产品推荐
相关产品推荐

