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 ) nicht. Wer gibt mir den entscheidenen Tipp .
Merci
menuBar und msgBox
- __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
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:
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?
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()
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?
Sorry, etwas schnell geschreiben
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
referenziert werden muessen. Das ist das kleine objektorientierte Programmierung 1-mal-1 von Python. Das muss schon sitzen.
Code: Alles auswählen
self.ShowMsgBox
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 !!!
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 !!!
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 ....
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 ....