Seite 1 von 1

Fenster schließen bei laufendem Programm

Verfasst: 30 Apr 2017, 12:48
von cjohn
Hallo allerseits,

ich bräuchte mal einen Tip von jemandem, der sich mit der Python GUI Programmierung auskennt ;-)

Ich kann ohne Probleme Dialogboxen öffnen etc., habe aber keine Möglichkeit gefunden ein laufendes Programm durch Drücken des X-Buttons des Hautprogramms zu verlassen. Solange das Programm läuft wird der Button einfach ignoriert...

Code: Alles auswählen

#! /usr/bin/env python3                                                                                                                                                                     
# -*- coding: utf-8 -*-                                                                                                                                                                     
#                                                                                                                                                                                           
import sys                                                                                                                                                                                  
from TxtStyle import *                                                                                                                                                                      
                                                                                                                                                                                            
def dialog(message):                                                                                                                                                                        
        msg = QMessageBox()                                                                                                                                                                 
        msg.setIcon(QMessageBox.Information)                                                                                                                                                
                                                                                                                                                                                            
        msg.setText(message)                                                                                                                                                                
        msg.setWindowTitle("Infobox")                                                                                                                                                       
        msg.setStandardButtons(QMessageBox.Ok)                                                                                                                                              
                                                                                                                                                                                            
        retval = msg.exec_()                                                                                                                                                                
                                                                                                                                                                                            
# define class for main program                                                                                                                                                             
class FtcGuiApplication(TxtApplication):                                                                                                                                                    
                                                                                                                                                                                            
        def closeEvent(self, event):                                                                                                                                                        
                TxtWindow.closeEvent(self, event)                                                                                                                                           
                print("EVENT")                                                                                                                                                              
                self.closed.emit()                                                                                                                                                          
                                                                                                                                                                                            
        def __init__(self, args):                                                                                                                                                           
                TxtApplication.__init__(self, args)                                                                                                                                         
                                                                                                                                                                                            
                # create the empty main window                                                                                                                                              
                MainWindow = TxtWindow("TestApp")                                                                                                                                           
                MainWindow.show()                                                                                                                                                           
                                                                                                                                                                                            
                for i in range(0, 3):                                                                                                                                                       
                        dialog("i= "+str(i))                                                                                                                                                
                                                                                                                                                                                            
                while 1:                                                                                                                                                                    
                        print("running...")                                                                                                                                                 
                                                                                                                                                                                            
                self.exec_()                                                                                                                                                                
                                                                                                                                                                                            
if __name__ == "__main__":                                                                                                                                                                  
        # create class instance                                                                                                                                                             
        FtcGuiApplication(sys.argv)
ich bin für jede Hilfe dankbar, GUI Progrmmierung ist neu für mich ;-(


Danke

Carsten

Re: Fenster schließen bei laufendem Programm

Verfasst: 30 Apr 2017, 15:42
von PHabermehl
Hallo,

ja, da haben wir einen sehr interessanten Fall...

Also, dein main window wird erst nach dem "self.exec_()" aktiv. Das MainWindow.show() zeigt es nur an...

In Deinem Dialog wiederum hast Du auch das "msg.exec_()", daß dafür sorgt, daß der Dialog selbst ausgeführt wird.

Aber vor dem self.exec_() würde ein GUI im Hauptfenster, ebenso wie der close-Button, noch gar nicht abgefragt.

Du möchtest jetzt code ausführen, WÄHREND das Hauptfenster aktiv ist. Dazu müßtest Du VOR dem self.exec_() einen Thread starten, in dem der Programmcode läuft.
ODER, wenn Du den code eventbasiert laufen lassen möchtest, dem Hauptfenster einen Button hinzufügen und mit <buttonname>.clicked.connect(funktion) die gewünschte Funktion ausführen lassen. Aber Obacht, während die Funktion läuft, wird das GUI im Hauptfenster auch nicht korrekt bedient bzw. Events wie close-Button nicht verarbeitet...

Gruß
Peter

Re: Fenster schließen bei laufendem Programm

Verfasst: 30 Apr 2017, 15:54
von PHabermehl
Ach so, und für den Dialog,

es gibt ja für die TXT-Programmierung die TouchUI.py in der community firmware.
Die hat eine wunderbare Messagebox-Funktion "TouchMessageBox(TouchDialog)", bzw. auch die parent-klasse(TouchDialog), das wäre bei einem TXT-GUI dem QDialog zu bevorzugen.

Außerdem gibts noch die TouchAuxiliary.py, die eine ganze Reihe fertiger Dialoge zur Verfügung stellt.

Infos in den beiden Dateien unter:
https://github.com/ftCommunity/ftcommun ... fs/opt/ftc

Gruß
Peter

Re: Fenster schließen bei laufendem Programm

Verfasst: 03 Mai 2017, 19:29
von cjohn
Hallo Peter,

danke für die schnelle Antwort. Wenn ich Zeit finde, probier ich am Wochenende mal weiter und berichte vom Ergebnis....


Viele Grüße


Carsten

Re: Fenster schließen bei laufendem Programm

Verfasst: 03 Mai 2017, 19:39
von PHabermehl
Moin,
schreib doch mal, was Du vorhast, dann können wir ja mal einen groben Plan machen...
Gruß
Peter