我有一个用Glade创建的界面。它包含一个DrawingArea和按钮。
我尝试创建一个线程来刷新每X次我的Canva。几秒钟后,我收到如下错误消息:
"X Window Server 0.0",“致命错误IO 11”
下面是我的代码:
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()如何修复这些错误?
发布于 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对象的子类化是的方式,而不是
_Thread__stop()的线程constructor.我希望这能帮到你。
https://stackoverflow.com/questions/2963585
复制相似问题