2016-03-19 2 views
1

Мне нужно перезапустить приложение при нажатии кнопки, но у меня возникают некоторые проблемы с ним. Я попробовал два метода:Как перезапустить QApplication

  1. this suggestion Пробовал и действительно перезапускает приложение, но я получаю ошибку Gtk_IS_INVISIBLE (widget) для каждого виджета, и все они выглядят по-разному в перезапущенном приложении, с очень «старым» посмотрите (аналогично виджетам TkInter). Есть ли способ решить эту ошибку? Кроме того, приложение работает отлично.

  2. Я также попытался:

    subprocess.Popen("/home/pi/pywork/pyqt/of2.py") 
    sys.exit(0) 
    

    as suggested here, но я получаю следующее сообщение об ошибке: OSError: [Errno 13] Permission denied. Есть ли способ отменить это отклоненное разрешение?

Ни один из них не работает должным образом. Есть ли способ исправить любой из них? Вы знаете альтернативный способ перезапуска приложения?

+1

Просьба уточнить, что вы имеете в виду под «перезагрузки», потому что эти два примера вам дают очень разные. Вам действительно нужно создать полностью новый * процесс? Или вам просто нужно создать новый объект приложения и главное окно в текущем процессе? Или, может быть, все, что вам нужно сделать, это создать новое главное окно, но использовать один и тот же объект приложения? Какую актуальную проблему вы пытаетесь решить? – ekhumoro

+0

Я хочу закрыть текущий процесс и начать новый. Я решил ошибки виджета в первом предложении, установив стиль в приложении, поэтому, поставив 'setStyle (« GTK + »)', ошибки виджетов исчезли. –

ответ

1

Вы можете использовать QProcess.startDetached:

QProcess.startDetached("/home/pi/pywork/pyqt/of2.py") 
sys.exit(0) 

Вы также должны правильно добавить shebang в свой питона скрипт:

#!/usr/bin/env python 
1

Второй метод дает ошибку, потому что файл не является исполняемым. Вы можете это исправить, но, вероятно, более надежным является просто повторный запуск сценария с использованием того же исполняемого файла python. Также было бы неплохо избегать жесткого кодирования пути сценария.

Вот простой демонстрационный скрипт, который реализует все, что:

import sys, os, subprocess 
from PyQt4 import QtCore, QtGui 

FILEPATH = os.path.abspath(__file__) 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.button = QtGui.QPushButton(
      'Restart [PID: %d]' % QtGui.qApp.applicationPid(), self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     try: 
      subprocess.Popen([sys.executable, FILEPATH]) 
     except OSError as exception: 
      print('ERROR: could not restart aplication:') 
      print(' %s' % str(exception)) 
     else: 
      QtGui.qApp.quit() 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 400, 100, 50) 
    window.show() 
    sys.exit(app.exec_()) 
Смежные вопросы