Python Beeware中Toga主窗口点击按钮切换视图问题如何解决?
解决方案
出现视图叠加的核心原因是你创建的新视图容器没有配置正确的布局属性,默认不会撑满整个窗口区域,且背景为透明会透出底层原有内容。你可以按照以下方案修改代码:
修改点说明
- 将启动时创建的根容器
main_box保存为实例属性,方便后续切换视图时直接操作容器内容 - 切换视图时先清空根容器的原有子元素,再添加新的视图内容,不需要替换整个主窗口的content,避免底层渲染异常
- 给所有视图容器添加基础布局样式,确保内容能正常排布
修改后完整代码
import toga from toga.style import Pack from toga.style.pack import COLUMN, ROW class exampleApp(toga.App): def startup(self): """ Construct and show the Toga application. Usually, you would add your application to a main content box. We then create a main window (with a name matching the app), and show the main window. """ # 根容器存为实例属性 self.main_box = toga.Box(style=Pack(direction=COLUMN, flex=1)) ### # Main Screen first_view = toga.Button('First View', on_press=self.first_view, style=Pack(padding=2)) second_view = toga.Button('Second View', on_press=self.second_view, style=Pack(padding=2)) home_box = toga.Box(style=Pack(direction=ROW, padding=2)) home_box.add(first_view) home_box.add(second_view) self.main_box.add(home_box) ### self.main_window = toga.MainWindow(title=self.formal_name) self.main_window.content = self.main_box self.main_window.show() def first_view(self, widget): # 清空根容器原有内容 self.main_box.clear() # 给新容器添加布局样式,确保撑满空间 new_box = toga.Box(style=Pack(direction=COLUMN, flex=1, padding=10)) screen_text = toga.Label('This screen will allow you to see your First View') new_box.add(screen_text) self.main_box.add(new_box) def second_view(self, widget): # 清空根容器原有内容 self.main_box.clear() # 给新容器添加布局样式,确保撑满空间 new_box = toga.Box(style=Pack(direction=COLUMN, flex=1, padding=10)) screen_text = toga.Label('This screen will allow you to see your Second View') new_box.add(screen_text) self.main_box.add(new_box) def main(): return exampleApp()
如果你需要保留返回首页的能力,只需要把首页的home_box也存为实例属性,切换的时候清空后重新添加home_box即可。
内容的提问来源于stack exchange,提问作者jfcabreras
相关产品推荐
相关产品推荐

