Fenster schließen bei laufendem Programm

Community-Firmware (cfw), Selbstbaucontroller (TX-Pi, ftduino, usw.), usw.
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
cjohn
Beiträge: 5
Registriert: 13 Mär 2017, 19:03

Fenster schließen bei laufendem Programm

Beitrag von cjohn » 30 Apr 2017, 12:48

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

Benutzeravatar
PHabermehl
Beiträge: 2430
Registriert: 20 Dez 2014, 22:59
Wohnort: Bad Hersfeld

Re: Fenster schließen bei laufendem Programm

Beitrag von PHabermehl » 30 Apr 2017, 15:42

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
https://www.MINTronics.de -- der ftDuino & TX-Pi Shop!

viele Grüße
Peter

Benutzeravatar
PHabermehl
Beiträge: 2430
Registriert: 20 Dez 2014, 22:59
Wohnort: Bad Hersfeld

Re: Fenster schließen bei laufendem Programm

Beitrag von PHabermehl » 30 Apr 2017, 15:54

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
https://www.MINTronics.de -- der ftDuino & TX-Pi Shop!

viele Grüße
Peter

cjohn
Beiträge: 5
Registriert: 13 Mär 2017, 19:03

Re: Fenster schließen bei laufendem Programm

Beitrag von cjohn » 03 Mai 2017, 19:29

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

Benutzeravatar
PHabermehl
Beiträge: 2430
Registriert: 20 Dez 2014, 22:59
Wohnort: Bad Hersfeld

Re: Fenster schließen bei laufendem Programm

Beitrag von PHabermehl » 03 Mai 2017, 19:39

Moin,
schreib doch mal, was Du vorhast, dann können wir ja mal einen groben Plan machen...
Gruß
Peter
https://www.MINTronics.de -- der ftDuino & TX-Pi Shop!

viele Grüße
Peter

Antworten