代码之家  ›  专栏  ›  技术社区  ›  Rodolfo

Python Tkinter-将控制器作为Tkinter帧的参数传递

  •  0
  • Rodolfo  · 技术社区  · 1 年前

    我有一个主课叫 应用程序 它调用4个控制器。方法 从home_page()开始 创建类型为的对象 主页 我希望这个对象能够访问所有4个控制器,我将把它们作为参数传递。方法如下:

        def start_from_home_page(self, fileSystemController, widgetController, logicController):
            from pages.HomePage import HomePage
            self.homePage = HomePage(self, fileSystemController, widgetController, logicController)
            self.homePage.grid(row = 0, column = 0, sticky = 'nsew')
            self.homePage.tkraise()
    

    这是 “应用程序”

    class App(ctk.CTk):
        def __init__(self, title, dim):
    
            # main setup
            super().__init__()
            self.title(title)
            self.geometry(f'{dim[0]}x{dim[1]}')
            self.minsize(dim[0],dim[1])
            
    
            os.chdir('/Users/mauri5566/Desktop/AST-CVE')
    
            self.widgetController = WidgetController(self)
            self.fileSystemController = FileSystemController(self)
            self.logicController = LogicController(self)
            self.navigationController = NavigationController(self)
    
            self.navigationController.start_from_home_page(self.fileSystemController, self.widgetController, self.logicController)
    
            self.mainloop()
    
    App('AST-CVE', (1000,800))
    

    下面的代码显示了HomePage类的初始部分(它继承自ctk.CTkFrame)。我得到了以下错误:

    bad screen distance ".!filesystemcontroller"
    

    这是因为第三个参数应该是框架的宽度。然而,我不需要这样做,我只想让类通过将它们作为参数传递来访问控制器,我该怎么做?

    这是 主页 类别:

    class HomePage(ctk.CTkFrame):
        def __init__(self,  navigationController: NavigationController,
                            fileSystemController: FileSystemController,
                            widgetController: WidgetController,
                            logicController: LogicController):
            super().__init__(navigationController, fileSystemController, widgetController, logicController)
    

    为了清楚起见,这就是ctk的方式。CTkFrame对象的结构如下:

    class CTkFrame(CTkBaseClass):
        
        def __init__(self,
                     master: Any,
                     width: int = 200,
                     height: int = 200,
                     corner_radius: Optional[Union[int, str]] = None,
                     border_width: Optional[Union[int, str]] = None,
    
                     bg_color: Union[str, Tuple[str, str]] = "transparent",
                     fg_color: Optional[Union[str, Tuple[str, str]]] = None,
                     border_color: Optional[Union[str, Tuple[str, str]]] = None,
    
                     background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None,
                     overwrite_preferred_drawing_method: Union[str, None] = None,
                     **kwargs):
    
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Bryan Oakley    1 年前

    你不应该把这些论点传递给 super.__init__ 。没有必要这样做,因为超类对它们一无所知。

    您只需要在自定义中保存对它们的引用 __init__ :

    class HomePage(ctk.CTkFrame):
        def __init__(self,  navigationController: NavigationController,
                            fileSystemController: FileSystemController,
                            widgetController: WidgetController,
                            logicController: LogicController):
            super().__init__()
            self.navigationController = navigationController
            self.fileSystemController = fileSystemController
            self.widgetController = widgetController
            self.logicController = logicController
    

    但是,由于您的实例 app 具有对所有这些实例的引用,您只需传递的实例 应用程序 然后通过它引用它们。