CustomTkinter中按钮点击结果未显示在目标FrameMain框架的问题
问题解决:让Check按钮内容显示在FrameMain框架中
问题根源
点击button_check后内容显示在FrameSelect里,是因为调用FrameMain.write_info_on_screen时传入的self是FrameSelect的实例,而非main.py中创建的FrameMain实例;同时全局变量file_path的使用也不够规范。
修改方案
1. 修改main.py:传递FrameMain实例给FrameSelect
先创建FrameMain实例,再将其作为参数传入FrameSelect的初始化方法,让FrameSelect能直接访问目标框架:
from customtkinter import * import tkinter as tk from tkinter import ttk from include.frame_select import FrameSelect from include.frame_main import FrameMain window = CTk() window.geometry("600x800+100+100") window.resizable(1,1) # 先实例化FrameMain frame_main = FrameMain(window) frame_main.grid(row=0, column=1, sticky=N+W) # 将frame_main传入FrameSelect frame_select = FrameSelect(window, frame_main) frame_select.grid(row=0, column=0, sticky=N+W) window.mainloop()
2. 修改include/frame_select.py:接收并使用FrameMain实例
去掉全局变量,改用实例属性存储文件路径,直接调用传入的FrameMain实例方法:
import tkinter as tk from tkinter import ttk, filedialog from customtkinter import * class FrameSelect(CTkFrame): def __init__(self, master, frame_main): super().__init__(master) self.configure(width=200) self.frame_main = frame_main # 保存FrameMain实例引用 self.file_path = None # 用实例属性替代全局变量 id_label = CTkLabel(self, text="Source file(s)", font=("Arial",18,"bold")) id_label.grid(row=0, column=0) CTkButton(self, text="Select", command=self.select_file).grid(row=1, column=0) CTkButton(self, text="Check", command=self.show_info).grid(row=2, column=0) def select_file(self): self.file_path = filedialog.askopenfilenames( title="Select a File", initialdir=".", filetypes=[("All files", "*.*")]) if self.file_path: print(list(self.file_path)) def show_info(self): if self.file_path: self.frame_main.write_info_on_screen(self.file_path) else: print("请先选择文件")
3. 修改include/frame_main.py:优化显示逻辑
添加容器管理文件标签,每次显示前清空旧内容,同时修正方法调用方式:
import tkinter as tk from tkinter import ttk from customtkinter import * class FrameMain(CTkFrame): def __init__(self, master): super().__init__(master) self.configure(width=300) # 创建专用容器存放文件标签,方便清空 self.file_frame = CTkFrame(self) self.file_frame.grid(row=1, column=0, padx=10, pady=10) def count_number_of_files(self, list_of_files): # 清空之前的标签内容 for widget in self.file_frame.winfo_children(): widget.destroy() # 生成新的文件标签 for i, file_name in enumerate(list_of_files): label = CTkLabel(self.file_frame, text=file_name) label.grid(row=0, column=i, padx=10, pady=10) def write_info_on_screen(self, file_path): self.count_number_of_files(file_path) # 直接调用实例方法
核心修改点
- 在
main.py中传递FrameMain实例,让FrameSelect能直接操作目标框架 - 替换全局变量为实例属性,避免变量污染
- 修正方法调用的上下文,确保操作的是
FrameMain实例而非FrameSelect
内容的提问来源于stack exchange,提问作者mrG
相关产品推荐
相关产品推荐

