Python Tkinter:传递控制器至CTkFrame子类的参数错误解决问询
解决CTkFrame子类传递控制器时的参数顺序问题
问题根源:ctk.CTkFrame的__init__方法第一个参数是父容器(parent),第二个参数是可选的width(数值类型)。你之前将控制器实例放在了第二个参数位置,被当成width解析,而控制器对象的字符串表示不是合法的尺寸值,因此触发"bad screen distance"错误。
以下是两种正确实现控制器传递的方案:
方案一:使用关键字参数传递自定义参数
通过将控制器作为自定义参数放在父类参数之后,并用**kwargs接收CTkFrame的其他可选参数,确保父类初始化时参数顺序正确:
import customtkinter as ctk # 定义HomePage子类 class HomePage(ctk.CTkFrame): def __init__(self, parent, controller, **kwargs): # 先调用父类初始化,仅传递parent和CTkFrame所需的关键字参数 super().__init__(parent, **kwargs) # 保存控制器实例,供页面内方法调用 self.controller = controller # 示例:调用控制器的方法 # self.controller.some_method() # App主类示例 class App: def __init__(self): # 实例化4个控制器 self.filesystem_controller = FilesystemController() self.controller2 = Controller2() self.controller3 = Controller3() self.controller4 = Controller4() self.root = ctk.CTk() self.start_from_home_page() def start_from_home_page(self): # 实例化HomePage时,按顺序传递parent、controller,可附加CTkFrame的配置参数 self.home_page = HomePage( parent=self.root, controller=self.filesystem_controller, width=800, height=600, corner_radius=10 ) self.home_page.pack(fill="both", expand=True) self.root.mainloop()
方案二:明确声明父类参数,将控制器放在末尾
如果不想使用**kwargs,可以明确列出CTkFrame的核心参数,将自定义的controller参数放在最后:
class HomePage(ctk.CTkFrame): def __init__(self, parent, width=200, height=200, controller=None, **kwargs): # 明确指定父类的width、height参数,避免顺序混淆 super().__init__(parent, width=width, height=height, **kwargs) self.controller = controller
调用时通过关键字指定controller:
self.home_page = HomePage( self.root, width=800, height=600, controller=self.filesystem_controller )
核心原则:确保传递给super().__init__的参数完全匹配CTkFrame的参数定义,自定义参数(如controller)要么放在父类参数之后,要么通过关键字形式传递,避免覆盖父类的必填/可选参数。
内容的提问来源于stack exchange,提问作者Rodolfo
相关产品推荐
相关产品推荐

