如何使用python在没有按键事件的情况下在内部更新/重画GTK小部件(GTKLabel)?
下面有一些代码试图更新GTK标签元素。我包括两个文件:ui文件和py文件 用户界面文件:如何使用python在没有按键事件的情况下在内部更新/重画GTK小部件(GTKLabel)?,python,gtk,pygtk,Python,Gtk,Pygtk,下面有一些代码试图更新GTK标签元素。我包括两个文件:ui文件和py文件 用户界面文件: <glade-interface> <widget class="GtkWindow" id="ApplicationFrame"> <property name="width_request">320</property> <property name="height_request">240</property>
<glade-interface>
<widget class="GtkWindow" id="ApplicationFrame">
<property name="width_request">320</property>
<property name="height_request">240</property>
<property name="visible">True</property>
<property name="events">GDK_KEY_PRESS_MASK</property>
<property name="title" translatable="yes">Simple</property>
<property name="resizable">False</property>
<property name="window_position">center-always</property>
<property name="default_width">320</property>
<property name="default_height">240</property>
<property name="decorated">False</property>
<property name="gravity">center</property>
<child>
<widget class="GtkFixed" id="layout">
<property name="width_request">320</property>
<property name="height_request">240</property>
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="l1">
<property name="width_request">320</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">l1</property>
</widget>
<packing>
<property name="y">43</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
这应该很简单,但我完全不知道我做错了什么。元素l1未正确更新。我认为try_to_update中的代码是我需要更新UI的地方,但是我不知道需要调用哪个函数。有人能帮忙吗
提前谢谢 您需要使用小部件的功能: queue_draw_area()方法通过调用小部件窗口及其所有子窗口上的
gtk.gdk.Window.invalidate_rect()
方法,使小部件的矩形区域(…)无效
但是,由于您已经在set
方法中这样做了,我猜
if hasattr(item,'show')
选中可防止项目更新。另一个检查是在整个窗口上调用queue\u draw
函数,看看这是否会更新内容
或者,强制按如下方式处理排队的事件:
while gtk.events_pending():
gtk.main_iteration_do(True)
代码中发生的一件事是,当执行
时,当执行某件事情时,不会处理任何事件。解决此问题的一种方法是在该方法内部的某个点强制执行事件处理:
--- code.py 2011-12-05 10:32:53.000000000 +0100
+++ code.py.bak 2011-12-05 10:27:22.000000000 +0100
@@ -95,8 +95,6 @@
timeout = 15
while timeout != 0:
self.set('l1','%s' % timeout)
- while gtk.events_pending():
- gtk.main_iteration()
wait(1)
timeout -= 1
print timeout
只是一个风格建议:type(item)==type(“”)
=>type(item)==str
=>isinstance(item,str)
,这很有用。谢谢我从来没有使用过多处理,但它看起来像是一个SimpleFrame
对象正在被共享,而没有遵循中描述的机制。我并不认为多重处理是个问题。我用它来识别一个与我正在做的类似的过程:某个东西独立于GTK事件来更新显示…但GUI本身并没有实际更新。很抱歉,我坚持,也许我在发送某个东西,但在没有运行gtk mainloop的进程中更新对象,新值预计将传播到运行不同python解释器的远程进程,并生成更新显示的事件。查看文档,如果不为该对象显式创建代理,我看不到支持这种交互。第83行:(不起作用。此外,item确实具有属性'show',因此应该执行…我最初在那里有item.show。但是我更改了它,因为我阅读了与文档中相同的功能。为了清晰起见,我删除了if语句。确定。尝试调用而gtk.events_pending():gtk.main_iteration_do(True)
在你的更新函数中;可能事件队列没有在你期望的时候被处理。谢谢。这工作得非常好。我现在有了一个函数,在C中调用gtk\U小部件队列绘制()之后调用gtk\U main\u iteration\u do()。
--- code.py 2011-12-05 10:32:53.000000000 +0100
+++ code.py.bak 2011-12-05 10:27:22.000000000 +0100
@@ -95,8 +95,6 @@
timeout = 15
while timeout != 0:
self.set('l1','%s' % timeout)
- while gtk.events_pending():
- gtk.main_iteration()
wait(1)
timeout -= 1
print timeout