Как обновить DrawingArea в PyGTK? - PullRequest
2 голосов
/ 03 июня 2010

У меня есть интерфейс, созданный с помощью Glade. Содержит область рисования и кнопки.

Я пытался создать тему для обновления каждый раз, когда моя 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()

Как я могу исправить эти ошибки?

1 Ответ

1 голос
/ 03 июня 2010

Чтобы использовать потоки Python в PyGTK, вам необходимо окружить любой доступ к общим объектам GTK с помощью gtk.gdk.threads_enter () и gtk.gdk.threads_leave () . См. Также метод threads_enter () .

Возможно, вам даже лучше использовать функции GTK для периодических вызовов функций, таких как timeout_add (...) и timeout_add_seconds (...) (обратите внимание, что в последнее время эти функции немного переместился, и в вашей установке они могут быть в GObject, а не в GLib).

Некоторые другие заметки:

  1. Создание подклассов объектов Thread - это способ ведения дел на Java, а не способ Python. Путь Python - определить функцию или вызываемый объект, который вам нужен, и передать его конструктору Thread.
  2. Вы не должны использовать _Thread__stop(). Это имя искажено по причине, которая заключается в том, что оно является частью внутреннего механизма объекта Thread и не предназначено для обычного публичного использования. Вместо этого вы должны использовать один из потоковобезопасных объектов (например, объект Condition ) и проверять его в функции, которую вы передали объекту Thread в первом шаге. В качестве альтернативы, установите ваш поток в качестве демона, чтобы он автоматически умирал при выходе из программы.
  3. Обычным расширением для файлов GTKBuilder является «.ui», а не «.glade» (хотя сам Glade добавляет «.glade» в качестве расширения по умолчанию.)

Надеюсь, это поможет.

...