Как закрыть 1-е окно после открытия 2-го окна в pygtk

В моем приложении pygtk я хочу закрыть текущее окно после открытия следующего окна.

это код, который я написал

#!/usr/bin/env python

# example base.py

import pygtk
pygtk.require('2.0')
import gtk
import subprocess

class Base:
    def next(self,widget):
        subprocess.call('fabfile.py', shell=True)
        self.window.destroy()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_size_request(200,200)
        self.button = gtk.Button("Hello World")
        self.button.show()
        self.button.connect("clicked", self.next)
        self.window.add(self.button)
        self.window.show()

    def main(self):
        gtk.main()

print __name__
if __name__ == "__main__":
    base = Base()
    base.main()

когда я нажимаю кнопку next, открывается следующее окно, но мое текущее окно не закрывается в фоновом режиме, и текущее окно зависает в фоновом режиме после открытия следующего окна.

def next(self,widget):
   subprocess.call("scan.py", shell=True)
   self.win.destroy()

когда я запускаю этот код в window machine, он не закрывает существующее окно, а когда я запускаю в Linux machine, он выдает эту ошибку.

/bin/sh: fabfile.py: command not found

Кто-нибудь дайте мне знать, как это сделать. Спасибо...


person Amit    schedule 27.11.2013    source источник
comment
Почему вы используете подпроцесс для чего-то подобного? Вы можете просто включить исходный код и сделать что-то вроде self.other_win.show(); self.win.hide();.   -  person Jussi Kukkonen    schedule 28.11.2013
comment
@jku В укрытии тоже такая же проблема. когда я скрываю текущее окно, оно скрывается перед открытием второго окна, а для открытия второго окна требуется больше времени   -  person Amit    schedule 28.11.2013
comment
Это совсем не похоже на ту же проблему для меня? Но, конечно, вы можете показать следующее окно и закрыть старое только тогда, когда новое окно получит сигнал о том, что оно готово: сигнал «карта» звучит как хороший, чтобы попробовать.   -  person Jussi Kukkonen    schedule 28.11.2013


Ответы (2)


Попробуйте это, я надеюсь, что это сработает,

import subprocess
proc=subprocess.Popen(["fabfile.py"], bufsize=2048, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.wait()
self.win.destroy()

or

        import subprocess
        proc=subprocess.Popen(["fabfile.py"], bufsize=2048, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        completed = False
        while not completed:
            if process.poll() is not None:
                completed = True

        print "communicating"
        process.communicate("k")
        print "communicated"

subprocess.Popen откроет ваше второе окно и закроется после текущего окна.

Обновить

Для Linux вы должны написать ниже код, когда будете использовать вызов подпроцесса

Скрипт содержит символы CR. Оболочка интерпретирует эти символы CR как аргументы.

Решение. Удалите символы CR из сценария, используя следующий сценарий.

with open('beak', 'rb+') as f:
    content = f.read()
    f.seek(0)
    f.write(content.replace(b'\r', b''))
    f.truncate()

для получения дополнительных разъяснений вы можете увидеть эту записанную ссылку

person Ashish Jain    schedule 11.12.2013
comment
Он работает в системе Windows, но в системе Linux, когда я вызываю другой файл py, он дает мне /bin/sh: fabfile.py: command not found. не открывается этот файл подскажите что делать. - person Amit; 14.12.2013
comment
В Linux-машине это произойдет, потому что когда вы набираете fabfile.py или /fabfile.py, он неправильно читает имя файла, он игнорирует символы. поэтому '/f' - это одиночный символ (канал формы ASCII). Вам нужно экранировать обратную косую черту, например, используя необработанный строковый литерал r'\f' (два символа). Для этого я обновил код выше, используйте его в Linux. - person Ashish Jain; 14.12.2013
comment
Спасибо @ashish, вы действительно решили мою проблему. Я развеял свои сомнения по этой ссылке или сценарию. - person Amit; 14.12.2013

http://www.python.org/doc//current/library/subprocess.html#convenience-functions

Выполнить команду с аргументами. Дождитесь завершения команды, затем верните атрибут кода возврата.

Вызов subprocess.call блокируется, win.destroy ни одна функция GTK не будет выполняться до тех пор, пока ваше scan.py приложение не выйдет. В C вы должны использовать g_spawn_async из GLib вы сможете найти эквивалент Python. Или использовать нить.

person liberforce    schedule 27.11.2013
comment
Я пробовал оба способа (по check_call или по потоку), но проблема не решается. Я использовал такой код subprocess.check_call(["scan.py", "-l"], shell=True). дайте мне знать, что я делаю. - person Amit; 28.11.2013
comment
check_call проблему не решит, тоже блокирует, как написано в документации. Как я уже сказал, попробуйте использовать glib.spawn_async из функции порождения процесса GLib. - person liberforce; 28.11.2013
comment
Я пытался использовать glib.spawn_sync, но я не получаю решения этой проблемы, я не знаю, я написал код, который является правильным или неправильным, потому что он не дает никаких ошибок или не решает. пожалуйста, помогите мне, я так раздражаю. - person Amit; 29.11.2013
comment
И это glib.spawn_async (async, а не sync). Асинхронный означает, что он не блокирует. Синхронный означает, что он блокирует. - person liberforce; 29.11.2013
comment
Я отредактировал свой пост со всем кодом. я не могу написать правильный код glib.spawn_async. Пожалуйста, дайте мне знать, как написать spawn_async и открыть следующее окно перед закрытием. - person Amit; 09.12.2013