В PyGTK, как использовать поток? - PullRequest
3 голосов
/ 13 мая 2011

У меня есть класс, который рисует графический интерфейс, используя gtk.

Нажатие кнопки вызовет метод, который будет запускать некоторые внешние программы.

Но графический интерфейс может не перерисовываться.

Одним из решений может быть использование потоков. Этот пример создает поток вне класса GUI и запускает его перед вызовом gtk.main ().

Как заставить поток вне класса GUI обнаруживать событие нажатия кнопки и вызывать подходящий метод?

1 Ответ

4 голосов
/ 13 мая 2011

Вам не нужен другой поток для запуска внешней программы, вы можете использовать цикл простоя Gtk.Вот несколько программ, которые я написал для этого.Он должен был прочитать стандартный вывод программы, чтобы показать его части в графическом интерфейсе, так что я оставил это там.Переменная «job_aborted» связана с кнопкой «Abort», которая позволяет досрочно завершить работу.

class MyWindow ...

    # here's the button's callback
    def on_simulate(self, button):
      self.job_aborted = False
      args = self.makeargs()  # returns a list of command-line args, first is program
      gobject.idle_add(self.job_monitor(args).next)


    def job_monitor(self, args):
       self.state_running()  # disable some window controls
       yield True  # allow the UI to refresh

       # set non-block stdout from the child process
       p  = subprocess.Popen(args, stdout=subprocess.PIPE)
       fd = p.stdout.fileno()
       fl = fcntl.fcntl(fd, fcntl.F_GETFL)
       fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)

       while True:

         if self.job_aborted:
           os.kill(p.pid, signal.SIGTERM)
           break

         poll = p.poll()
         if poll is not None:
           break

         try:
           line = p.stdout.readline()
           if line:
              line = line.strip()
              # update display

         except IOError:
           pass

         yield True

       self.state_ready()  # re-enable controls
       if self.job_aborted:
         # user aborted
       else:
         # success!
...