2016-03-19 12 views
1

ボタンをクリックしたときにアプリケーションを再起動する必要がありますが、いくつか問題があります。私は2つの方法を試してみた:QApplicationを再起動する方法

  1. this suggestionを試してみましたが、それが実際にアプリケーションを再起動しますが、私はすべてのウィジェットのGtk_IS_INVISIBLE (widget)エラーを取得し、それらのすべてを再開したアプリケーションに違って見える、非常に「古い」とlook(TkInterウィジェットに似ています)。このエラーを解決する方法はありますか?この他に、アプリケーションは正常に動作します。

  2. 私も試してみました:

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

    as suggested here、私は次のエラーを取得:OSError: [Errno 13] Permission deniedを。この拒否されたアクセス許可を無効にする方法はありますか?

どれも正常に動作していないようです。それらのいずれかを修正する方法はありますか?アプリケーションを再起動する別の方法がわかりますか?あなたはQProcess.startDetachedを使用することができ

+1

あなたが与える二つの例は非常に異なっているので、あなたは「再起動」によって何を意味するのか明確にしてください。あなたは実際に完全に*新しい*プロセスを作成する必要がありますか?または、現在のプロセス内に新しいアプリケーションオブジェクトとメインウィンドウを作成するだけですか?あるいは、新しいメインウィンドウを作成するだけですが、同じアプリケーションオブジェクトを使用するだけです。あなたが解決しようとしている実際の問題は何ですか? – ekhumoro

+0

私は現在のプロセスを閉じて、新しいプロセスを開始したいと思います。私はアプリにスタイルを設定することで最初の提案のウィジェットエラーを解決しました。そのため、 'setStyle(" GTK + ")'を置くことで、ウィジェットのエラーはなくなりました。 –

答えて

1

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

また、適切にあなたのPythonスクリプトにshebangを追加する必要があります。

#!/usr/bin/env python 
1

ファイルが実行可能ではありませんので、第2の方法はエラーになります。これを修正することはできますが、同じ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_()) 
関連する問題