Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python在没有按键事件的情况下在内部更新/重画GTK小部件(GTKLabel)?_Python_Gtk_Pygtk - Fatal编程技术网

如何使用python在没有按键事件的情况下在内部更新/重画GTK小部件(GTKLabel)?

如何使用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>

下面有一些代码试图更新GTK标签元素。我包括两个文件:ui文件和py文件

用户界面文件:

<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