【问题标题】:Rebuild interface to change the language (GTK)重建界面以更改语言(GTK)
【发布时间】:2014-06-04 19:29:20
【问题描述】:

我开始开发一个我想要多语言支持的程序,但由于它非常模块化(我希望它在未来更加模块化),语言更改意味着“破坏你所拥有的界面和使用语言模块具有的内容再次构建”。 (你现在可以在GitHub看到源代码)

这种完全模块化的方法可能会带来很多问题,但我仍然想要它,所以问题是:每当我销毁我拥有的小部件时,直到我独自使用原始 Gtk.Window 本身,我都无法再次为其分配小部件。它们根本不会显示,有时会静默显示,有时会出现错误,具体取决于我的方法。

  1. 假设类窗口继承自 Gtk.Window。

  2. 这个类是原始窗口,我分配给它一个 Gtk.Box - self.interface。

  3. self.interface 本身,有两个 Gtk.Box,一个侧边栏和一堆内容。

为了重建,我尝试了:

  • 更改语言变量
  • 在 self.interface 上使用方法destroy,删除小部件及其子部件。
  • 重用该函数在 self.interface 之上构建小部件堆栈
  • 将 self.interface 重新添加到 self(窗口)。

这种方法返回:

g_object_unref:断言“G_IS_OBJECT(对象)”失败 gtk.main()

指向this file中的.show_all()方法。

我已经尝试在不使用 .destroy 的情况下离开界面,仅在其子界面上应用,然后在其上再次创建它们,但没有奏效。窗口是空白的,完全没有错误。

我现在正在尝试的代码是:

#Remember, self is a Gtk.Window()
def __init__(self):
    [...]
    self.interface = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
    self.stack = None
    self.add(interface)
    self.build_interface()

def build_interface(self):
    self.interface.pack_start(
            self.create_side_navigation(
                self.interface_data["menu"][self.language]["name"])
            , False, False, 0
        )
        self.stack = self.create_content_stack(self.interface_data["menu"][self.language])
        self.interface.pack_start(self.stack, True, True, 0)

###Code to rebuild(this is a question dialog):
if response == Gtk.ResponseType.OK:
    self.language = self.new_language["Index"]
    self.new_language = None

    self.stack.destroy()
    self.interface.destroy()
    self.interface = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
    self.build_interface()
    self.add(self.interface)

此代码将导致先前告知的“g_object_unref”错误。 这是什么原因造成的?为什么删除后无法添加?

随意克隆 repo 并尝试,代码注释很好(但我不确定是否写得不好,我是 python 新手)并且很容易理解有问题的部分在哪里。它不是太大。

PS:由于popovers,它应该需要GTK+3.12。

【问题讨论】:

    标签: python gtk gtk3 pygobject


    【解决方案1】:

    正如一位 GTK 开发人员向我展示的那样,GTK 默认情况下所有小部件都是不可见的。

    错误是在声明整个界面可见性的行中引起的 (windowclass.show_all()),但由于界面在应用后发生了变化,因此引发了该警告。

    他将我指向.remove() 而不是.destroy(),并在设置后将.show_all() 设置为新元素。

    该 git 上的下一次提交(或以下)有解决方案。

    【讨论】:

      【解决方案2】:

      多语言的最佳方式是保持您的小部件不变,仅更改标签和标题的文本。这可以在不干扰整体设置的情况下完成。例如:

      s='Stop'
      if lang=='fr': s='Arret'
      ...
      somelabel.set_label(s)
      

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 2012-05-24
        • 1970-01-01
        • 2017-01-11
        • 2015-10-20
        相关资源
        最近更新 更多