【问题标题】:How do I change the built-in button labels on a gtk.Assistant?如何更改 gtk.Assistant 上的内置按钮标签?
【发布时间】:2013-03-29 21:41:11
【问题描述】:

我想将gtk.Assistant 的“应用”按钮的标签更改为“开始”。我在Assistant 实例中找不到对应的gtk.Button 小部件。

这是两页Assistant的一些基本代码:

import gtk

a = gtk.Assistant()

page = gtk.CheckButton("Something optional")
a.append_page(page)
a.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
a.set_page_title(page, "Make decisions")
a.set_page_complete(page, True)

page = gtk.Label("Alright, let's build some foo.")
a.append_page(page)
a.set_page_type(page, gtk.ASSISTANT_PAGE_CONFIRM)
a.set_page_title(page, "Confirm")
a.set_page_complete(page, True)

a.connect('delete-event', gtk.main_quit)
a.connect('close', gtk.main_quit)
a.show_all()

gtk.main()

在最后一页,您会看到“应用”按钮。我想将该文本更改为“开始”。

gtk.Assistant.children().get_children() 返回页面小部件列表。

gtk.Assistant.get_child() 返回无。

gtk.Assistant.get_action_area() 不是方法。

这是文档的链接。:http://www.pygtk.org/docs/pygtk/class-gtkassistant.html

如何找到我感兴趣的gtk.Button

【问题讨论】:

  • 这家伙似乎和你有同样的问题:mail-archive.com/pygtk@daa.com.au/msg14905.html 但他似乎暗示你想要的修改可以在 C 中进行。你在 C 中尝试过类似的东西吗?如果可能的话,您可以在 C 中为此编写代码部分,然后将 C 代码绑定到 Python 并在那里运行一小部分代码。
  • 对不起,我想这个建议似乎是残酷的矫枉过正,但我​​能想到的让它工作的唯一方法就是破解实际的实现本身。从 python 中做到这一点似乎并不容易......
  • @eazar 感谢您的建议。这太过分了,但在不改变 PyGTK 本身的情况下似乎没有其他方法。
  • @eazar 你想发表你的评论作为答案吗?
  • 我会发布答案,但唯一的问题是我还没有测试它是否真的有效。我以前从未在 C 中实际尝试过 gtk。如果我今天晚些时候有时间,我会试一试,如果可行,我会发布答案 [=

标签: python pygtk wizard


【解决方案1】:

我在尝试变通方法时设法找到了解决方案。

gtk.Assistant 用返回页面列表的东西覆盖了gtk.Container.get_children() 方法,但它实际上仍然是gtk.HBox() 的父级,其中包含“下一步”、“应用”、“取消”按钮等。

gtk.Assistant.add_action_widget() 方法将一个小部件添加到所谓的“操作区域”。原来这是包含相关按钮的HBox。以下函数将产生对HBox 的引用:

def get_buttons_hbox(assistant):
    # temporarily add a widget to the action area and get its parent
    label = gtk.Label('')
    assistant.add_action_widget(label)
    hbox = label.get_parent()
    hbox.remove(label)
    return hbox

然后使用get_buttons_hbox(a).get_children()检索按钮。

for child in get_buttons_hbox(a).get_children():
    print child.get_label()

打印出来:

gtk-goto-last
gtk-go-back
gtk-go-forward
gtk-apply
gtk-cancel
gtk-close

所以下面的代码解决了这个问题(使用上面定义的get_buttons_hbox()):

for child in get_buttons_hbox(a).get_children():
    label = child.get_label()
    if label == 'gtk-apply':
        child.set_label('Start')

【讨论】:

    【解决方案2】:

    我不确定 pygtk 是否可以做到这一点。如果你使用 python 切换到 GObject Introspection,你可以设置一个完全自定义的操作区域。来自Gtk3 GtkAssistant 文档:

    如果您的案例不太适合 GtkAssistants 的方式 处理按钮,您可以使用 GTK_ASSISTANT_PAGE_CUSTOM 页面类型 并自己处理按钮。

    GTK_ASSISTANT_PAGE_CUSTOM 用于没有其他页面类型的情况 合适的。不会显示任何按钮,应用程序必须添加 通过 gtk_assistant_add_action_widget() 拥有自己的按钮。

    【讨论】:

    • 很遗憾,GObject Introspection 在 Windows 上尚不可用,因此我无法使用此解决方案。
    • 哦,我明白了。 eazar001 的解决方案有效,但由于显而易见的原因,它没有吸引力。恕我直言,正确的/pythonic 方式是创建您自己的基于 GtkWindow 的复合小部件。毕竟,GtkAssistant 只是一个便利类,而不是一个非常复杂的类(参见“简单胜于复杂。复杂胜于复杂”——Python 之禅)
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多