通过名称从其父控件访问Gtk3小部件

2024-04-26 22:13:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的程序从配置文件中读取。它根据配置文件在窗口上加载Gtk3小部件。在

配置文件示例:

[Clock1]
format = %H:%M:%S
color = #FF0000

[Clock2]
format = %H:%M
bgColor = #00FF00

所以,我自己做了一个类,比如时钟类型的widget,我称之为Clock。在

示例:

^{pr2}$

说明:

  1. 代码读取配置文件并看到它必须创建一个时钟小部件。所以它生成了一个Clock类,其中有一个GtkLabel作为变量。runCommand函数将应用于小部件,配置文件将读取更多属性。E、 g.时钟的format属性。

  2. 为了保持时间的更新,update函数每1秒从一个WidgetManager类运行一次。

  3. 一旦没有要添加的小部件的更多命令(属性),运行widget()函数,以返回GtkWidget并将其添加到主窗口。

上面的代码在一段时间内运行良好,但是标签会在短时间内(1-2分钟或更短)停止更新。在

{1美元^

代码成功运行到18:53:31,然后标签停止更新。我想Gtk会在内部将对象移动到另一个内存中,我不能再使用我的旧对象(?)访问它。在

我该如何解决这个问题?我应该做些不同的事情吗?在

我考虑将父小部件(它是Gtk.Window子类)传递给子控件(Clock),并按名称搜索代表self.gtkwidgetGtk.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

结果:

enter image description here

注意事项:

  1. 子窗口和父窗口子窗口上的小部件的内存地址是相同的,即使标签的文本已经停止更新。即使这样,两个对象也引用同一个内存地址。

  2. 如果您注意到了,我直接从窗口的子级(名为childd)调用set_text函数,并且这也不会更新值。

这不是我代码中的bug,我应该强制Gtk重画的可能性有多大?在

编辑2

即使在self.gtkwidget.queue_draw()之后self.gtkwidget.queue_draw(),问题似乎仍然存在。在


Tags: 对象函数代码textselfformatgtk部件