【问题标题】:PyGObject page switching with buttonsPyGObject 页面切换按钮
【发布时间】:2021-10-16 11:16:17
【问题描述】:

我想借助 Gtk.Stack 中的按钮切换页面。共有3个页面,应用程序的标题栏有一个前进和一个后退按钮。我希望它在按下前进按钮时转到下一页,并在按下后退按钮时转到上一页。它的当前状态只能在第1页和第2页之间切换。

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)

        # 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):
        self.stack.set_visible_child_name("page1")
    def on_button2_clicked(self, widget):
        self.stack.set_visible_child_name("page2")


win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

【问题讨论】:

    标签: python gtk gtk3 pygtk pygobject


    【解决方案1】:

    我不知道是否有一种简单的方法可以让 GtkStack 中的下一个子节点可见,或者除 GtkAssistant 之外的其他容器是否具有此功能。

    不过,您可以通过多种方式自行实现。要么这样:

    def on_button1_clicked(self, widget):
        pages = self.stack.get_children()
        cur_page = self.stack.get_visible_child()
        i = pages.index(cur_page)
        if i == 0: return
        self.stack.set_visible_child(pages[i-1])
    
    def on_button2_clicked(self, widget):
        pages = self.stack.get_children()
        cur_page = self.stack.get_visible_child()
        i = pages.index(cur_page)
        if i == len(pages) - 1: return
        self.stack.set_visible_child(pages[i+1])
    

    GtkContainer.get_children() 获取堆栈的子级,找到当前可见子级的索引,然后加/减一个以获取下一页/上一页。 警告:我不确定get_children() 是否总是按照添加的顺序返回子小部件。

    或者在您的__init__() 函数中,您可以创建一个列表来存储您的页面名称/小部件,例如self.page_names = ['page0', 'page1', 'page2']。然后你可以这样做:

    def on_button1_clicked(self, widget):
        cur_page_name = self.stack.get_visible_child_name()
        i = self.page_names.index(cur_page_name)
        if i == 0: return
        self.stack.set_visible_child_name(self.page_names[i-1])
    

    或者,也许您可​​以使用 RegEx 从子名称中提取页码(例如,0 来自 page0)并生成下一页的名称。有很多方法可以做到这一点,我个人会保留所有页面的变量并使用它来确定下一个/上一个页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多