2016-10-20 2 views
1

Ich habe ein Memory-Spiel in PyQt5 gemacht. Wenn der Benutzer gewinnt, würde Ich mag eine Nachricht mit drei Optionen (Tasten) zeigen:Verwenden Sie QMessageBox in PyQt5, um mein Spiel neu zu starten oder die Anwendung zu beenden

  1. 'wieder spielen'
  2. 'change Karten' 'beenden'

I Ich denke, der Weg, dies zu implementieren, besteht darin, eine QMessageBox zu verwenden, aber ich konnte nicht verstehen, wie man sie richtig benutzt. Ich weiß, dass es so etwas wie sein muss:

reply = QMessageBox.question(self, 
    'title', 
    'text', 
    button1 | button2 | button3, 
    defaultButton) 

if reply == button1: 
    # play again 
elif reply == button2: 
    # change cards 
else: 
    # close application 

Ich weiß auch, gibt es StandardButtons, die ich zum Verlassen verwenden können (QMessageBox.Close, aber ich bin mir nicht sicher), aber ich weiß nicht, wie kann ich sie hinzufügen und andere benutzerdefinierte Schaltflächen, damit es funktioniert.

EDIT 1

Ok, ich glaube ich ein paar Schritte in die richtige Richtung gemacht, auch wenn etwas fehlt stil ist. Ich konnte benutzerdefinierte Tasten zu meinem QMessageBox hinzufügen, ich bin in der Lage, print etwas, wenn einer von ihnen angeklickt wird, aber jede Methode, die ich anrufe, macht nichts. Wenn "quit" ausgewählt ist, schließt es auch das Meldungsfeld (ich verwende die QCloseEvent Methode, vielleicht ist es falsch). Hier

ist der aktualisierte Code, zusammen mit einigen Bemerkungen:

msgBox = QMessageBox() 
msgBox.setStandardButtons(QMessageBox.Close) 
restartBtn = msgBox.addButton('play again', QMessageBox.ActionRole) 
changeBtn = msgBox.addButton('change cards', QMessageBox.ActionRole) 

ret = msgBox.exec() 

if ret == QMessageBox.Close: 
    QCloseEvent() # should close the app, but it closes the message box 
elif msgBox.clickedButton() == restartBtn: 
    print('RESTART') 
    self.restart # should call 'restart' method, but it doesn't 
elif msgBox.clickedButton() == changeBtn: 
    print('CHANGE') 
    changeBtn.clicked.connect(self.showDialog) # should call 'showDialog' method, but it doesn't 

Wie Sie sehen können, habe ich versucht, beide mit self.methodname und mit button.clicked.connect(self.methodname), aber keiner arbeitete.

Antwort

2

Sie scheinen die meisten davon bereits gearbeitet zu haben, aber hier ist ein komplettes Beispiel:

def showMessageBox(self): 
    msg = QtWidgets.QMessageBox(self) 
    msg.setIcon(QtWidgets.QMessageBox.Question) 
    msg.setWindowTitle('Prompt') 
    msg.setText('Please choose an option:') 
    play = msg.addButton(
     'Play Again', QtWidgets.QMessageBox.AcceptRole) 
    change = msg.addButton(
     'Change Cards', QtWidgets.QMessageBox.AcceptRole) 
    quit = msg.addButton(
     'Quit', QtWidgets.QMessageBox.RejectRole) 
    msg.setDefaultButton(play) 
    msg.exec_() 
    msg.deleteLater() 
    if msg.clickedButton() is play: 
     print('RESTART') 
     self.restart() 
    elif msg.clickedButton() is change: 
     print('CHANGE') 
     self.showDialog() 
    else: 
     self.close() 
+0

Akzeptiert, da es meine eigene Antwort vervollständigt. Danke nochmal)! – umbe1987

1

Schließlich wurde mir klar, dass das, was ich tat, fast richtig war, mit Ausnahme fehlt die Klammer nach den Methoden aufrufen . Jetzt läuft der Code ganz gut, außer dass die Anwendung nicht beendet wird, wenn 'quit' geklickt wird (nur das Nachrichtenfeld), aber ich werde meine Antwort aktualisieren, sobald ich den Weg finde. Ich hoffe, dass dies ein gutes Beispiel für jeden sein könnte, der sein eigenes QMessageBox implementieren möchte.

Eine letzte Anmerkung: sowohl die Methoden, die ich versucht habe, nämlich die Methode selbst aufzurufen, oder sie durch Voranstellen der button.clicked.connect() Methode aufzurufen, funktionierte für mich. Vielleicht ist einer besser als der andere, aber ich urteile.

1

self.close funktioniert als eine Methode zum Schließen der gesamten Anwendung.

button.clicked.connect(self.close) 

choice = QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Quit) 

if choice == QtGui.QMessageBox.Quit: 
     self.close() 
Verwandte Themen