PyGTK,Glade,更改窗口视图和线程

时间:2010-03-31 15:13:54

标签: python multithreading pygtk glade

请原谅我,如果这看起来像是一个愚蠢的问题,到目前为止,我还没有找到有人提供这方面的解决方案,而我只是希望得到一些比我更有经验的人的反馈(我只是现在已经使用python,pyGTK和Glade 2天了。)

我有一个UI窗口显示,它会更新来自处理蓝牙连接的线程的消息。

这很好,我的应用程序关闭并运行得非常可靠,问题是,在进行蓝牙连接后我希望维护蓝牙线程(即保持连接运行)但完全改变主窗口的UI

现在我从使用glade制作的pyGTK应用程序获得的印象是,最简单的事情就是打开一个新窗口。这真的是最好的选择吗?我可以在根目录中删除小部件树,维护窗口小部件但是从单独的glade文件中添加一组新的小部件吗?

如果打开一个新窗口是最好的选择,我是否正确地假设蓝牙线程在此转换期间可以保持活动状态,并提供更新任何回调?

任何帮助或指示都会很棒。

干杯, 马特

2 个答案:

答案 0 :(得分:2)

如果我很好理解连接与窗口严格耦合。这似乎是aggregationcomposition的一个很好的例子。简单地将窗口与​​连接分离。没有代码或更多信息是不可能更准确的。在此之后,您可以同时使用您提出的解决方案:创建一个带有连接线程参考的新窗口,或者“分离”整个窗口小部件树并附加一个全新的窗口,简单使用gtk.Container.removegtk.Container.add (gtk.Window派生自gtk.Container)。

如果这还不够,请修改您的问题并添加一些信息和代码。

答案 1 :(得分:0)

我想你已经知道了,但GTK(PyGtk)是线程感知的而不是线程安全的,所以,从另一个不是那个持有gtk主循环的线程修改UI可能会让你的程序崩溃。

您可以多次使用.glade文件,如果需要,可以只使用一个窗口小部件(及其子窗口),并忽略其他所有内容,这就是gtk.glade.XML接受根参数的原因。这个根是您的小部件树将开始的地方。

gladeobject = gtk.glade.XML(path_to_glade_file, root='widgetname')

您可以安全地隐藏窗口并保持更新,并避免使用“新窗口”解决方案。