首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PyGTK中刷新DrawingArea?

如何在PyGTK中刷新DrawingArea?
EN

Stack Overflow用户
提问于 2010-06-03 13:50:13
回答 1查看 1.5K关注 0票数 2

我有一个用Glade创建的界面。它包含一个DrawingArea和按钮。

我尝试创建一个线程来刷新每X次我的Canva。几秒钟后,我收到如下错误消息:

"X Window Server 0.0",“致命错误IO 11”

下面是我的代码:

代码语言:javascript
复制
import pygtk
pygtk.require("2.0")
import gtk
import Canvas
import threading as T
import time
import Map

gtk.gdk.threads_init()

class Interface(object):
    class ThreadCanvas(T.Thread):
        """Thread to display the map"""
        def __init__(self, interface):
            T.Thread.__init__(self)
            self.interface = interface
            self.started = True
            self.start()

        def run(self):
            while self.started:
                time.sleep(2)
                self.interface.on_canvas_expose_event()

        def stop(self):
            self.started = False

    def __init__(self):
        self.interface = gtk.Builder()
        self.interface.add_from_file("interface.glade")

    #Map
    self.map = Map.Map(2,2)

        #Canva
        self.canvas = Canvas.MyCanvas(self.interface.get_object("canvas"),self.game)
        self.interface.connect_signals(self)

        #Thread Canvas
        self.render = self.ThreadCanvas(self)

    def on_btnChange_clicked(self, widget):
    #Change map
        self.map.change()

    def on_interface_destroy(self, widget):
        self.render.stop()
        self.render.join()
        self.render._Thread__stop()
        gtk.main_quit()

    def on_canvas_expose_event(self):
        st = time.time()
        self.canvas.update(self.map)
        et = time.time()
        print "Canvas refresh in : %f times" %(et-st)

    def main(self):
        gtk.main()

如何修复这些错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-03 14:00:22

要在PyGTK中使用Python线程,需要用gtk.gdk.threads_enter()gtk.gdk.threads_leave()包围对共享GTK对象的任何访问。另请参阅threads_enter()方法。

使用GTK函数进行定期函数调用可能会更好,比如timeout_add(...)timeout_add_seconds(...) (注意,最近这些函数发生了一些变化,在您的安装中,它们可能在GObject中,而不是在GLib中)。

其他一些注意事项:

Java对象的子类化是的方式,而不是

  1. 的方式。Python的方法是定义一个您需要的函数或可调用对象,并将其传递给不应该使用_Thread__stop()的线程constructor.
  2. You。它之所以被命名为“乱码”,是因为它构成了Thread对象的内部机制的一部分,而不是用于正常的公共用途。相反,您应该使用线程安全对象之一(例如,一个线程对象),并从第一步中传递给Condition对象的函数中检查它。
  3. GTKBuilder文件通常的扩展名是".ui",而不是".glade“(即使Glade本身附加了".glade”作为默认扩展名)。

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2963585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档