2010-06-03 10 views
2

Glade로 만든 인터페이스가 있습니다. 그것은 DrawingArea와 버튼을 포함합니다.PyGTK에서 DrawingArea를 새로 고침하는 방법은 무엇입니까?

내 Canva를 X 번 새로 고치는 쓰레드를 만들려고했습니다. 몇 초 후, 나는 얻을 오류 메시지처럼 : 나는 이러한 오류를 수정할 수있는 방법

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() 

:

"X 윈도우 서버 0.0", "치명적인 오류 IO 11"여기

내 코드입니다 ?

답변

1

PyGTK에서 파이썬 스레드를 사용하려면 gtk.gdk.threads_enter()gtk.gdk.threads_leave()으로 공유 GTK 객체에 대한 모든 접근을 둘러싸 야합니다. threads_enter() 방법을 참조하십시오.

timeout_add(...)timeout_add_seconds(...)과 같이 주기적 함수 호출을 위해 GTK 함수를 사용하는 것이 더 나을 수도 있습니다. 최근에는 이러한 함수가 약간 움직 였고 설치시 GLIB가 아닌 GObject에있을 수 있습니다.

일부 다른 노트 :

  1. 서브 클래 싱 스레드 객체는 일을하지 파이썬 방식의 자바 방법입니다. 파이썬 방법은 필요한 것을 함수 나 호출 가능한 객체로 정의하고이를 Thread 생성자에 전달하는 것입니다.
  2. _Thread__stop()을 사용하지 않아야합니다. 이것은, Thread 오브젝트의 내부기구의 일부를 구성 해, 일반 공개 용으로는 사용되지 않는, 이유 때문에 엉망이 된 이름입니다. 대신 스레드 안전 객체 (예 : Condition 객체) 중 하나를 사용해야하고 1 단계에서 Thread 객체에 전달한 함수에서 검사해야합니다. 또는 스레드를 데몬으로 설정하면 프로그램이 종료 될 때 자동으로 종료됩니다.
  3. GTKBuilder 파일에 대한 일반적인 확장 (습지 자체가 기본 확장으로 ".glade"를 추가하더라도.) 없습니다 ".glade", ".ui"입니다

도움이 되었기를 바랍니다.

+0

감사합니다. 작동합니다. Thread.Lock() 및 Thread.RLock()을 사용하여 모든 액세스를 처리하려고했습니다. 나는 당신의 의견을 메모합니다. – Lialon

관련 문제