Fenster schließen bei laufendem Programm

Alle APIs oder Firmwares für den TXT: Community-Firmware, .net, C++, usw.
Forumsregeln
Bitte beachte die Forumsregeln!

Fenster schließen bei laufendem Programm

Beitragvon 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
cjohn
 
Beiträge: 5
Registriert: 13 Mär 2017, 20:03

Re: Fenster schließen bei laufendem Programm

Beitragvon 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
PHabermehl
 
Beiträge: 447
Registriert: 20 Dez 2014, 23:59
Wohnort: Bad Hersfeld
Alter: 44

Re: Fenster schließen bei laufendem Programm

Beitragvon 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/ftcommunity-TXT/tree/master/board/fischertechnik/TXT/rootfs/opt/ftc

Gruß
Peter
PHabermehl
 
Beiträge: 447
Registriert: 20 Dez 2014, 23:59
Wohnort: Bad Hersfeld
Alter: 44

Re: Fenster schließen bei laufendem Programm

Beitragvon 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
cjohn
 
Beiträge: 5
Registriert: 13 Mär 2017, 20:03

Re: Fenster schließen bei laufendem Programm

Beitragvon 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
PHabermehl
 
Beiträge: 447
Registriert: 20 Dez 2014, 23:59
Wohnort: Bad Hersfeld
Alter: 44


Zurück zu TXT-Sonderprogrammierungen

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 2 Gäste