menuBar und msgBox

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Hallo zusammen,

gegeben Phyton 3, Qt6 und ein User in den Kinderschuhen.

Ich möchte bei einem click auf einen Menüpunkt (menubar) eine msgBox öffnen. Bekomme ich nicht hin, bin zu blöd. Menubar funktioniert, aber die "Schnittstelle" zu meiner msgBox scheint falsch gestrickt zu sein.

# Info
infoHilfeAktion = QAction('Info', self)
infoHilfeAktion.setStatusTip('Information')
infoHilfeMsg = QMessageBox()
infoHilfeMsg.setWindowTitle('Information')
infoHilfeMsg.setText("Keine da")
infoHilfeAktion.triggered.action(self.infoHilfeMsg.show())

funktioniert (natürlich :wink: ) nicht. Wer gibt mir den entscheidenen Tipp :idea: .

Merci
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GiJay: Du rufst `show()` auf und übergibst den Rückgabewert von dem Aufruf an einer Stelle wo die etwas übergeben werden muss was dann erst aufgerufen wird wenn das Signal kommt. Also falls das ansonsten korrekt ist, sind die Klammern beim `show()` zu viel.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Hallo blackjack,

vielen Dank für die Info, aber ohne funktioniert es auch nicht .... und weiteres auch nicht. Ich habe wohl grundsätzlich etwas nicht verstanden. Hier mal mein Code:

Code: Alles auswählen


from PyQt6.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QMessageBox

# Beginn Variablen -------------------------------------------------------------------------------------------
# error_msg_ini = False

# Ende Variablen ----------------------------------------------------------------------------------------------
   
 
class MainWindow(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)      
        
    # MainFenster Einstellungen 
        self.setWindowTitle("Anne's kleines BueroTool") 
         
    # *** MENU-BAR ***
        menuBar = self.menuBar()
    # MenuBar Eintraege
    # * DATEI *
        menuDatei = menuBar.addMenu("&Datei")
    # Drucken
        menuDateiDrucken = menuDatei.addAction("Drucken")
        menuDateiDrucken.setEnabled(False)
    # Seperator
        menuDatei.addSeparator()
    # Ende
        menuDateiEnde = menuDatei.addAction("Ende")
        menuDateiEnde.setShortcut("Ctrl+Q")
        menuDateiEnde.setStatusTip("Programm beenden")
        menuDateiEnde.triggered.connect(self.close)
    # KONTAKTE
        menuKontakte = menuBar.addAction("&Kontakte")
        menuKontakte.triggered.connect(lambda: self.StartSubWindow("K"))
        
    # OBJEKTE
        menuObjekte = menuBar.addAction("&Objekte")
        menuObjekte.triggered.connect(lambda: self.StartSubWindow("O"))

    # DB
        menuDB = menuBar.addMenu("&db")
        menuDB.setEnabled(False)
    # HILFE
        menuHilfe = menuBar.addMenu("&Hilfe")
        menuHilfeInfo = menuHilfe.addAction("Info")
        menuHilfeInfo.setShortcut("Ctrl+A")
        menuHilfeInfo.setStatusTip("Information für Anne")
        menuHilfeInfo.triggered.connect(ShowMsgBox)

    
    # *** STATUS-BAR ***
        statusBar = self.statusBar()
    
    
    def StartSubWindow(self,  t):
        
        if t == "K":
            startSubWindowKontakte = QMdiSubWindow()
            self.mdi.addSubWindow(startSubWindowKontakte)
            startSubWindowKontakte.setWindowTitle("Kontakte")
##            mdi.menuKontakte.setEnabled(False)
            startSubWindowKontakte.show()
   
        if t == "O":
            startSubWindowObjekte = QMdiSubWindow()
            self.mdi.addSubWindow(startSubWindowObjekte)
            startSubWindowObjekte.setWindowTitle("Objekte")
            startSubWindowObjekte.show()
   
        if t == "E":
            startSubWindowEinstellungen = QMdiSubWindow()
            self.mdi.addSubWindow(startSubWindowEinstellungen)
            startSubWindowEinstellungen.setWindowTitle("Einstellungen")
            startSubWindowEinstellungen.show()
   
    
    def ShowMsgBox():
        msgBox = QMessageBox()
        msgBox.setWindowTitle("Information")
        msgBox.exec()

#   ... zum testen: 
#   winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)

app = QApplication([])
mdi  = MainWindow()
mdi.show()
app.exec()

Mein Problem ist, dass meine Funktion in einer anderen Funktion "nicht erkannt" wird.

Unter "'# HILFE" ist der Eintrag "menuHilfeInfo.triggered.connect(ShowMsgBox)". Hier erhalte ich die Fehlermeldung "unhandle NameError "name 'ShowMsgBox' is not defined". Ich habe aber mit def eine Funktion ShowMsgBox definiert. Warum wird diese nicht gefunden?

Auch unter # KONTAKTE habe ich dies "menuKontakte.triggered.connect(lambda: self.StartSubWindow("K"))" nur zum laufen gebracht, da ich "lamda" verwendet habe. Aber eigentlich müsste die Funktion "StartSubWindow" doch bekannt sein.

Der Code öffnet ein Fenster und ich kann weitere Fenster darin öffnen. Dies funktioniert auch. Die Fenster erhalten die Überschrift "Kontakte" oder "Objekte". Ich möchte, dass jedoch auf eine Fenster pro Überschrift beschränken. EIne einfache Möglichkeit wäre, den MenüPunkt zu deaktivieren, wenn ein Fenster bereits geöffnet ist. Diese wollte ich mit "mdi.menuKontakte.setEnabled(False)" (siehe f "StartSubWindow"). Auch hier wird gemeckert, dass die Funktion nicht bekannt ist.

Als 3 Probleme, eigentlich immer mit dem gleichen Tenor: die Funktion wird nicht gefunden! Was habe ich nicht begriffen?
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Sorry, etwas schnell geschreiben ;-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast nicht begriffen, dass ShowMsgBox kein bekannter Name ist, weil die Referenz auf "bound methods" eines Objektes (was du hier brauchst/willst) so wie *alles* in Python (auch andere Attribute des Objektes) zwingend mittels

Code: Alles auswählen

self.ShowMsgBox
referenziert werden muessen. Das ist das kleine objektorientierte Programmierung 1-mal-1 von Python. Das muss schon sitzen.
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Hi __deets__,

ja, ich weiß ja, dass das alles noch nicht sitzt. Aber ohne probieren, lerne ich es nie. Vielen Dank für Deine Geduld mit einem Newbie. Werde die Tage ein weiteres Buch ordern, wo es vielleicht für mich besser erklärt ist.
Habe natürlich wie vorgeschlagen ergänzt und freue mich nun über das Ergebnis "showMsgBox"! Danke!

Darf ich dann noch nachhaken?
Wie referenziere ich denn "menuKontakte.setEnabled(False)" richtig? Folgendes funktioniert nicht:
self.MainWindow.menuKontakte.setEnabled(False)

Merci !!!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da du das vorher nicht an self.menuKontakte gebunden hast, sondern das nur als lokale Variable rumflog, gar nicht. Alles, was du "aufheben" oder spaeter benutzen willst, muss eben an self gebunden werden.
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Kapiert!

self.menuKontakte = menuBar.addAction("&Kontakte")
self.menuKontakte.triggered.connect(lambda: self.StartSubWindow("K"))

Läuft! Danke!
Ein kleiner Schritt für Dich, ein riesiger Schritt für .... ;-)
Antworten