我的程序从配置文件中读取。它根据配置文件在窗口上加载Gtk3小部件。在
配置文件示例:
[Clock1]
format = %H:%M:%S
color = #FF0000
[Clock2]
format = %H:%M
bgColor = #00FF00
所以,我自己做了一个类,比如时钟类型的widget,我称之为Clock。在
示例:
^{pr2}$说明:
代码读取配置文件并看到它必须创建一个时钟小部件。所以它生成了一个Clock类,其中有一个GtkLabel作为变量。runCommand
函数将应用于小部件,配置文件将读取更多属性。E、 g.时钟的format
属性。
为了保持时间的更新,update
函数每1秒从一个WidgetManager
类运行一次。
一旦没有要添加的小部件的更多命令(属性),运行widget()
函数,以返回GtkWidget并将其添加到主窗口。
上面的代码在一段时间内运行良好,但是标签会在短时间内(1-2分钟或更短)停止更新。在
{1美元^
代码成功运行到18:53:31,然后标签停止更新。我想Gtk会在内部将对象移动到另一个内存中,我不能再使用我的旧对象(?)访问它。在
我该如何解决这个问题?我应该做些不同的事情吗?在
我考虑将父小部件(它是Gtk.Window
子类)传递给子控件(Clock
),并按名称搜索代表self.gtkwidget
的Gtk.Label
(通过迭代子控件?)。因此,通过名称获得Gtk.Widget
,将其转换为Gtk.Label
,并调用其更新代码。我如何实现这一点?在
另一方面,我认为我想得太多了,也许有一个更简单的解决办法。在
编辑
经过一些测试后,我决定将parent
作为参数传递给子对象(widget)的构造函数,并在子函数的update()
上运行父函数并从那里检查字符串(直接从父窗口访问子gtkwidget)。请注意,此时,父对象的唯一子对象是一个标签(GtkLabel)。有一些有趣的结果。在
代码如下:
#UPDATE FUNCTION OF THE CHILD
def update(self):
print "Setting clock text to", strftime(self.format, gmtime())
self.parent.runFromChildToParent(self.gtkwidget, strftime(self.format, gmtime()))
self.gtkwidget.set_text(strftime(self.format, gmtime()))
#PARENT FUNCTION CALLED FROM THE CHILD
def runFromChildToParent(self, child, textToSet):
for childd in self.get_children():
print "The current text on the child is", childd.get_text()
childd.set_text(textToSet)
print childd, child
结果:
注意事项:
子窗口和父窗口子窗口上的小部件的内存地址是相同的,即使标签的文本已经停止更新。即使这样,两个对象也引用同一个内存地址。
如果您注意到了,我直接从窗口的子级(名为childd
)调用set_text
函数,并且这也不会更新值。
这不是我代码中的bug,我应该强制Gtk重画的可能性有多大?在
编辑2
即使在self.gtkwidget.queue_draw()
之后self.gtkwidget.queue_draw()
,问题似乎仍然存在。在
您必须使用GObject timeout_add函数定期更新ui。。。在
请不要这么懒,下次再看文件吧!你可以写成千上万行完美的代码,但你厌倦了在谷歌搜索“Gtk定期更新用户界面”?为什么?在
相关问题 更多 >
编程相关推荐