如何使用按钮实现PyGObject中Gtk.Stack的多页面前后切换功能
现有代码的问题在于两个按钮的点击回调逻辑均为固定值,点击后退永远跳转到page1、点击前进永远跳转到page2,没有根据当前实际显示的页面动态计算目标页码,因此只能在页面1和页面2之间切换。
解决方法
- 在类的初始化方法中新增实例变量存储当前显示的页面索引,初始值设为0,对应第一页
page0 - 修改两个按钮的点击回调逻辑:
- 点击后退按钮:若当前页码大于0,页码减1后跳转至对应页面
- 点击前进按钮:若当前页码小于页面总数的最大索引(3个页面对应最大索引为2),页码加1后跳转至对应页面
修改后完整代码
import gi, os gi.require_version("Gtk", "3.0") gi.require_version("Handy", "1") from gi.repository import Gtk, Handy Handy.init() class MyWindow(Handy.Window): def __init__(self): super().__init__(title="Hello World") self.set_default_size(500, 300) # 新增当前页码记录变量 self.current_page = 0 # WindowHandle self.handle = Handy.WindowHandle() self.add(self.handle) # Box self.winbox = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL) self.handle.add(self.winbox) # Headerbar self.hb = Handy.HeaderBar() self.hb.set_show_close_button(True) self.hb.props.title = "Stack Example" self.winbox.pack_start(self.hb, False, True, 0) # Stack self.stack = Gtk.Stack() self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) self.winbox.pack_start(self.stack, True, True, 0) # Labels self.label = Gtk.Label(label="Page 1") self.stack.add_titled(self.label, "page0", "Label") self.label = Gtk.Label(label="Page 2") self.stack.add_titled(self.label, "page1", "Label") self.label = Gtk.Label(label="Page 3") self.stack.add_titled(self.label, "page2", "Label") # Headerbar button 1 self.button = Gtk.Button() self.button = Gtk.Button.new_from_icon_name("pan-start-symbolic", Gtk.IconSize.MENU) self.hb.pack_start(self.button) self.button.connect('clicked', self.on_button1_clicked) # Headerbar button 2 self.button2 = Gtk.Button() self.button2 = Gtk.Button.new_from_icon_name("pan-end-symbolic", Gtk.IconSize.MENU) self.hb.pack_start(self.button2) self.button2.connect("clicked", self.on_button2_clicked) def on_button1_clicked(self, widget): if self.current_page > 0: self.current_page -= 1 self.stack.set_visible_child_name(f"page{self.current_page}") def on_button2_clicked(self, widget): # 若后续新增页面,可将2替换为 len(self.stack.get_children()) - 1 实现自动适配 if self.current_page < 2: self.current_page += 1 self.stack.set_visible_child_name(f"page{self.current_page}") win = MyWindow() win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main()

内容的提问来源于stack exchange,提问作者Alperen İsa
相关产品推荐
相关产品推荐

