【发布时间】:2014-06-04 19:29:20
【问题描述】:
我开始开发一个我想要多语言支持的程序,但由于它非常模块化(我希望它在未来更加模块化),语言更改意味着“破坏你所拥有的界面和使用语言模块具有的内容再次构建”。 (你现在可以在GitHub看到源代码)
这种完全模块化的方法可能会带来很多问题,但我仍然想要它,所以问题是:每当我销毁我拥有的小部件时,直到我独自使用原始 Gtk.Window 本身,我都无法再次为其分配小部件。它们根本不会显示,有时会静默显示,有时会出现错误,具体取决于我的方法。
假设类窗口继承自 Gtk.Window。
这个类是原始窗口,我分配给它一个 Gtk.Box - self.interface。
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。
【问题讨论】: