Tkinter子面板不显示及面板切换失效问题排查与解决
问题记录与处理
- 因最初核心问题已解决,关闭此问题
我正在开发一款小型应用,左侧面板展示菜单按钮,右侧呈现对应功能。
问题1及解决
问题1: 主应用窗口正常显示,AppDownloader()单独运行也正常,目标是让AppDownloader()框架显示在右侧面板中。
解决方法: 绘制面板的调用未放在__init__中,将已有的draw_downloader_pane()方法添加到AppDownloader.__init__()中解决了此问题。目前仍在处理下载面板的组件布局问题,此问题独立于当前问题。
问题2:面板无法切换
问题2: 但面板仍无法切换,即使已确认AppTransform.__init__()方法不存在问题1的相同情况。
我已检查master引用,确保调用的是正确的框架,认为tkraise()作用于正确对象。点击主窗口按钮时能得到调试信息,但页面无法切换。
更新:已包含问题1解决方案的修订版AppDownloader()代码
app_main.py
import tkinter as tk from tkinter import Misc import customtkinter as ctk ## my modules from app_downloader import AppDownloader from app_transform import AppTransform from app_toolkit import CTK_DARK_MODE, CTK_COLOR_SCHEME, PADX, PADY, COLOR_THEME # log formatting from my_logging import setup_logging logger = setup_logging('app_main.py') ctk.set_appearance_mode(CTK_DARK_MODE) ctk.set_default_color_theme(CTK_COLOR_SCHEME) class AppMain(ctk.CTk): def __init__(self, *args, **kwargs): ctk.CTk.__init__(self, *args, **kwargs) WIDTH = 680 HEIGHT = 600 MENU_WIDTH = 280 self.title("Switch Frames") self.geometry(f'{WIDTH}x{HEIGHT}') self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) self.left_master = ctk.CTkFrame(master=self, **COLOR_THEME, width=MENU_WIDTH, corner_radius=0) self.left_master.pack(side=tk.LEFT, fill=tk.Y, expand=False, padx=PADX, pady=PADY) self.right_master = ctk.CTkFrame(master=self, **COLOR_THEME, corner_radius=0) self.right_master.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) def draw_left_menu(self): row_i=1 menu_heading = ctk.CTkLabel(master=self.left_master, text="Activity Menu", font=("Roboto Medium", -16)) menu_heading.grid(row=row_i, column=0, padx=PADX, pady=PADY) row_i += 1 BTN_PADX = 9 BTN_PADY = 8 BTN_IPADY = 5 self.menu_buttons = [ {'btn_name': 'download', 'btn_label': 'Download Shelf', 'frame_name': 'AppDownloader'}, {'btn_name': 'transform', 'btn_label': 'Transform Data', 'frame_name': 'AppTransform'}, {'btn_name': 'updates', 'btn_label': 'Find Updates (Unimplemented)', 'frame_name': None}, {'btn_name': 'ids', 'btn_label': 'Find Book IDs (Unimplemented)', 'frame_name': None}, {'btn_name': 'save', 'btn_label': 'Save Results (Unimplemented)', 'frame_name': None}, {'btn_name': 'quit', 'btn_label': 'Quit App', 'frame_name': None}, ] for data in self.menu_buttons: str_var = tk.StringVar() str_var.set(data['btn_label']) btn = ctk.CTkButton(self.left_master, textvariable=str_var, corner_radius=6, width=130) btn._text_label.configure(wraplength=140) data['btn_object'] = btn if 'quit' in data['btn_label']: btn.grid(row=row_i, column=0, padx=BTN_PADX, pady=(40,0), ipady=BTN_IPADY) else: btn.grid(row=row_i, column=0, padx=BTN_PADX, pady=BTN_PADY, ipady=BTN_IPADY) row_i += 1 def draw_right_container(self): self.frames = {} self.right_container = ctk.CTkFrame(self.right_master) self.right_container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) for F in (AppDownloader, AppTransform): page_name = F.__name__ frame = F(parent=self.right_container, controller=self) self.frames[page_name] = frame frame.pack(side="top", fill=tk.BOTH, expand=True) def show_frame(self, frame_name): frame = self.frames[frame_name] ## debug statement logger.debug(f"{frame}") frame.tkraise() def configure_buttons(self): self.menu_buttons[0]['btn_object'].configure(command=lambda:self.show_frame('AppDownloader')) self.menu_buttons[1]['btn_object'].configure(command=lambda:self.show_frame('AppTransform')) def start_app(self): self.draw_left_menu() self.draw_right_container() self.configure_buttons() a = AppMain() a.start_app() a.mainloop()
修正后的AppDownloader代码(app_downloader.py)
class AppDownloader(ctk.CTkFrame, InitValues): def __init__(self, parent, controller): ctk.CTkFrame.__init__(self, parent, **COLOR_THEME) InitValues.__init__(self) self.parent = parent self.controller = controller self.grid_columnconfigure(1, weight=0, uniform='auto') # init code here self.draw_downloader_pane() # functionality methods snipped def draw_downloader_pane(self): self.frame_body = ctk.CTkFrame(master=self.parent, **COLOR_THEME) banner_frame = ctk.CTkFrame(master=self.parent, **COLOR_THEME) banner_frame.pack(side=tk.TOP, fill=tk.X, expand=True, padx=PADX, pady=PADY) banner = ctk.CTkLabel(master=banner_frame, text="Download and Save Files", **COLOR_THEME) banner.pack(side=tk.TOP, fill=tk.X, expand=True, padx=PADX, pady=PADY) self.draw_frame_body() self.frame_body.pack(side=tk.TOP, fill=tk.BOTH, expand=True, padx=PADX)
内容的提问来源于stack exchange,提问作者Meghan M.
相关产品推荐
相关产品推荐

