GTK: уничтожить окно и запустить внешний скрипт по нажатию кнопки - PullRequest
0 голосов
/ 06 апреля 2011

Это в значительной степени название вопроса.Мне, наверное, здесь не хватает интерпретации некоторых сигналов ...

На PyGTK я делаю:

class Foo:

    def __init__(self):
        self.gladefile = gladefile
        self.wTree = gtk.glade.XML(self.gladefile, 'some_window')
        self.window = self.wTree.get_widget('some_window')
        events = { 'on_code_submit_clicked' : self.submit }
        self.wTree.signal_autoconnect(events)

    def submit(self):
        self.window.destroy()
        os.system('external_script')
        code = Foo()

Что происходит, когда кнопка нажимается, она остается нажатой, а затемскрипт запускается, и после закрытия внешней программы окно «мигает», снова разрушается и воссоздается.

Я также пробовал сигналы «нажата» и «отпущена».

Мне нужно поведение:

  1. Нажать на кнопку
  2. Уничтожить текущее окно
  3. Запустить внешний скрипт (который откроет окно другой программы)
  4. Воссоздайте окно Foo () после закрытия внешнего приложения.

Я могу представить, что событие запускается во время события clicked , а непосле.Вот почему окно остается открытым.Документы PyGTK ничего не говорят о чем-то вроде gtk_signal_connect_after на странице поляна , что делает меня совершенно потерянным из-за этого.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2011

Похоже, вам придется вызывать внешний скрипт из потока.

Я не работал с потоками с python, но похоже, что модуль потоков подойдетработа (по крайней мере, это то, что я хотел бы попробовать).В Glib также есть поддержка потоков, но я не могу найти для него документы pygtk.

Когда внешний скрипт завершит работу, не пересоздайте Foo из потока, но запланируйте функцию обратного вызова, чтобы сделать это, используяgobject.idle_add.Это связано с тем, что вся работа с графическим интерфейсом должна выполняться в потоке событий gtk, иначе ваша программа может аварийно завершить работу.

0 голосов
/ 07 апреля 2011

Размещение моего решения ... это просто как.

    self.window.hide()
    glib.idle_add(subprocess.call, ['external_script', 'param'])
    glib.idle_add(self.window.show)
0 голосов
/ 06 апреля 2011

Почему бы не скрыть окно и показать его после внешнего скрипта?

self.window.hide()
os.system('external_script')
self.window.show()
...