2015-08-04 35 views
6

Mi rendo conto che questa domanda è stata posta diverse volte prima, anche se nessuno di loro sembra applicarsi alla mia situazione. Ho installato PyQt, e sto semplicemente cercando di aprire una finestra in quanto tale:La finestra PyQt QWidget si chiude immediatamente dopo essere stata visualizzata?

import sys 
from PyQt4 import QtGui as qt 

segmentation = qt.QApplication(sys.argv) 
main = qt.QWidget() 
main.show() 

Tutte le altre domande che ho guardato su qui di solito sono stati causati da un errore con la finestra che va fuori portata a causa della il metodo show della finestra chiamato da una funzione o qualcosa di simile.

Il mio codice non utilizza alcuna funzione, quindi questo non può essere il problema. Questo dovrebbe funzionare così com'è, no? Sto seguendo questo tutorial:

https://www.youtube.com/watch?v=JBME1ZyHiP8

e al tempo 8:58, l'istruttore ha più o meno esattamente quello che ho scritto, e la loro finestra si presenta e rimane intorno bene. Il mio visualizza per una frazione di secondo e poi si chiude.

schermata del blocco di codice dal video da confrontare con il blocco di codice fornito qui:

Demo code that works

+1

Guarda il video. La demo non ha il codice '.exec _()'. A parte i nomi delle variabili, il codice pubblicato dall'OP è lo stesso. La domanda è: perché funziona lì, ma non quando l'OP lo esegue. – Andy

+1

Ho aggiunto uno screenshot del video per coloro che non desiderano navigare nel momento indicato dall'OP. Questo dimostra che il codice è simile (i nomi delle variabili sono diversi), ma che la finestra rimane aperta nella demo. – Andy

+0

@Andy Grazie andy – Anonymous

risposta

11

Senza vedere tutto il codice, sto supponendo che vi state perdendo il bit sys.exit() .

Per il codice specifico sys.exit(segmentation.exec_()) sarebbe quello che ti serviva.

segmentation = qt.QApplication(sys.argv) 
main = qt.QWidget() 
main.show() 
sys.exit(segmentation.exec_()) 

Un po 'di dettaglio di quello che sta succedendo qui.

segmentation = qt.QApplication(sys.argv) crea l'applicazione effettiva.

main = qt.QWidget() e main.show() crea il widget e quindi visualizza.

Quando si esegue lo script python, questo è esattamente quello che si dice di:

  1. creare un'applicazione
  2. Creare un widget
  3. Mostra il widget
  4. finito. Fine della sceneggiatura.

Ciò che lo sys.exit() fa chiude in modo pulito lo script python. segmentation.exec_() avvia l'elaborazione in background guidata da eventi di QT. Una volta terminato lo segementation.exec_() (l'utente chiude l'applicazione, il software chiude l'applicazione o si verifica un errore) restituisce un valore che viene quindi passato alla funzione sys.exit() che a sua volta termina il processo python.

+0

Guarda il video. La demo non ha il codice '.exec _()'. A parte i nomi delle variabili, il codice pubblicato dall'OP è lo stesso. – Andy

+0

@ jphollowed, questa risposta è corretta però. L'aggiunta della riga di codice fornita qui impedirà la chiusura della finestra. – Andy

+1

Questo è letteralmente tutto il mio codice. Ho appena iniziato il tutorial e sono arrivato a questo punto prima che tutto andasse storto. Se guardi le 8:58 nel video collegato, il mio codice esatto funziona per lui. Ho appena provato ciò che suggerisci e risolve il problema. Ma mi chiedo ancora perché 'sys.exit' non fosse richiesto nel video, ma richiesto per me. Grazie. – Anonymous