如何在Gtk3与Python中检测Gtk.Stack页面切换?
Gtk3完全支持检测这类操作,核心逻辑是:Gtk.StackSidebar只是Gtk.Stack的UI控制组件,页面切换的本质是修改了绑定Stack的visible-child属性,因此直接监听Stack的notify::visible-child信号即可,无需单独处理Sidebar的事件。
实现步骤与代码示例
- 创建Gtk.Stack和对应的Gtk.StackSidebar并完成绑定
- 为Stack绑定
notify::visible-child信号,触发时获取当前激活页面信息
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class StackDemo(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="StackSidebar 切换检测") self.set_default_size(400, 300) # 主布局容器 box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) self.add(box) # 创建Stack与Sidebar并绑定 self.stack = Gtk.Stack() self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) sidebar = Gtk.StackSidebar() sidebar.set_stack(self.stack) box.pack_start(sidebar, False, False, 0) box.pack_start(self.stack, True, True, 0) # 添加测试页面 page1 = Gtk.Box() page1.add(Gtk.Label(label="页面 1")) self.stack.add_titled(page1, "page1", "页面一") page2 = Gtk.Box() page2.add(Gtk.Label(label="页面 2")) self.stack.add_titled(page2, "page2", "页面二") page3 = Gtk.Box() page3.add(Gtk.Label(label="页面 3")) self.stack.add_titled(page3, "page3", "页面三") # 绑定页面切换信号 self.stack.connect("notify::visible-child", self.on_stack_page_changed) def on_stack_page_changed(self, stack, param_spec): # 获取当前页面的ID和标题 current_page_id = stack.get_visible_child_name() current_page_title = stack.get_page(stack.get_visible_child()).get_title() print(f"已切换到页面:{current_page_title}(ID: {current_page_id})") win = StackDemo() win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main()
关键说明
notify::visible-child信号会在Stack的可见子组件变更时触发,无论变更来自StackSidebar点击、代码调用还是其他操作- 可通过
get_visible_child_name()获取页面ID,get_page()配合get_title()获取页面显示标题 - 这是Gtk3官方推荐的实现方式,因为StackSidebar本身不提供独立的切换信号,所有操作都会同步到绑定的Stack上
内容的提问来源于stack exchange,提问作者ShadowOfHassen
相关产品推荐
相关产品推荐

