ich bin absolute anfängerin, sowohl bei python als auch beim programmieren generell.
ich habe jetzt ein mainwindow erstellt und würde gern eine action(?) zu einem menüunterpunkt hinzufuegen, sodass sich beim klicken auf diesen menuepunkt ein dialogfenster oeffnet, das ich bereits in einer anderen pythin datei erstellt habe.
ich wuerd mich sehr ueber eure hilfe freuen!!!
liebe grüße
action zu menubar hinzufuegen
-
- User
- Beiträge: 80
- Registriert: Dienstag 14. November 2006, 10:40
Hallo und willkommen pylis,
was hast du denn schon gemacht? Ohne deinen Quellcode zu sehen ist eine Hilfe natürlich immer etwas schwammig und ggf. eher ein Raten.
Man kann eine Callback-Methode über einen Event-Handler an einen Menüpunkt hängen. In der Callback-Methode wird dann
z.B. dein gewünschter Dialog aufgerufen. Das würde schematisch etwa so aussehen:
Wahrscheinlich sagt dir sowas wie Callback nicht viel, aber vielleicht solltest du dir von den wx-Seite unbedingt die wxDemo runterladen. In dem Demo-Browser kannst du mal nach "Menü" suchen. Im Democode findest du dann auch Beispiele, wie man Methoden an Menüpunkte bindet und andere Aktionen starten kann....
Ich bin etwas in Eile, ich hoffe, aber ich konnte trotzdem etwas helfen...
Viele Grüße
Piet Lotus
was hast du denn schon gemacht? Ohne deinen Quellcode zu sehen ist eine Hilfe natürlich immer etwas schwammig und ggf. eher ein Raten.
Man kann eine Callback-Methode über einen Event-Handler an einen Menüpunkt hängen. In der Callback-Methode wird dann
z.B. dein gewünschter Dialog aufgerufen. Das würde schematisch etwa so aussehen:
Code: Alles auswählen
...
# Irgendwo in deiner Menü-Klasse/Methode
self.Bind(<Hier ein gewünschtes wx.Event eintragen>,<Hier deine self.Callback-Methode eintragen>)
...
def CallbackMethode(self, event):
'''
Ist die Methode, die oben über "self.Callback-Methode" angesprochen wird..
'''
...
dein Dialogaufruf
Ich bin etwas in Eile, ich hoffe, aber ich konnte trotzdem etwas helfen...
Viele Grüße
Piet Lotus
also das ist mein quellcode, den ihc bereits erstellt habe:
Ich würde gern, dass beim Klicken auf "Neuer Subject Code" sich der Dialog oeffnet.
Kann mir jemand helfen?
Vielen Dank im Voraus
Code: Alles auswählen
import sys
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setWindowTitle('Daten')
menubar = self.menuBar()
menufile = menubar.addMenu('&File')
EingabeSubjectID = QtGui.QAction(QtGui.QIcon(),'Neuer Subject Code',self)
menuDateneingabe = menubar.addMenu('&Dateneingabe')
menuDateneingabe.addAction(EingabeSubjectID)
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
# Was beim Klicken auf "Neuer Subject Code" geoeffnet werden soll:
class DlgSubjectInfo(QtGui.QDialog):
DlgSubjectInfoRunSignal = QtCore.pyqtSignal(str, str, str, str, str, str, str)
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle('Please enter...')
#widgets
self.labelSubjCode = QtGui.QLabel("Subject Code:")
self.lineEditSubjCode = QtGui.QLineEdit("Subject Code")
self.Placeholder = QtGui.QFrame()
self.Placeholder.setFrameShape(QtGui.QFrame.StyledPanel)
self.pushButtonRun = QtGui.QPushButton("Ok")
self.pushButtonCancel = QtGui.QPushButton("Cancel")
self.hbox6 = QtGui.QHBoxLayout()
self.hbox6.addWidget(self.pushButtonCancel)
self.hbox6.addWidget(self.pushButtonRun)
#layout
self.hbox1 = QtGui.QGridLayout()
self.hbox1.addWidget(self.labelSubjCode, 0, 1)
self.hbox1.addWidget(self.lineEditSubjCode, 0, 2)
self.layoutQForm = QtGui.QFormLayout()
self.layoutQForm.addRow(self.hbox1)
#self.layoutQForm.addRow(self.groupbox)
self.layoutQForm.addRow(self.Placeholder)
self.layoutQForm.addRow(self.hbox6)
self.setLayout(self.layoutQForm)
#signals and connections
self.pushButtonRun.clicked.connect(self.Run)
self.pushButtonCancel.clicked.connect(self.Cancel)
def Run(self):
self.lineEditSubjCode = self.lineEditSubjCode.text()
self.close()
def Cancel(self):
self.close()
def main():
app = QtGui.QApplication(sys.argv)
win = DlgSubjectInfo()
win.show()
app.exec_()
if __name__ == "__main__":
main()
Kann mir jemand helfen?
Vielen Dank im Voraus

@pylis: Du kannst zwei unabhängige, vollständige GUI-Programme nicht einfach so hintereinander in eine Quelltextdatei kopieren. Beim starten läuft das bis Zeile 22 und danach geht es erst weiter wenn der Benutzer die erste GUI-Anwendung beendet.
Du brauchst aus dem zweiten Programm nur die Dialog-Klasse und die muss definiert werden bevor sie benutzt wird, also musst Du sicherstellen, dass die ``class``-Anweisung ausgeführt wird bevor Du die Kontrolle mit `exec_()` an die Qt-Hauptschleife übergibst.
Zur `QAction`: Deren `triggered()`-Signal muss mit Code verbunden werden der den Dialog anzeigt. Da könntest Du mal in der Qt-Dokumentation beim `QDialog` den Abschnitt über „Modal Dialogs” lesen.
Der Signalname `DlgSubjectInfoRunSignal` enthält ziemlich viel redundante Information. Die Klasse heisst ja schon `DlgSubjectInfo`, damit würde `RunSignal` völlig ausreichen. Und Signale tatsächlich `Signal` zu nennen ist nicht üblich. Die Signale die es bei den Klassen schon gibt haben diesen Zusatz nicht. Bleibt `run` übrig. Da `run` etwas längerfristiges ist, so ein Signal aber nur einen ”Zeitpunkt” signalisieren kann, würde ich es `started` nennen. Ebenfalls nach dem Muster der ganzen bereits vorhandenen Signale.
In der `DlgSubjectInfo.__init__()` wird ausnahmslos alles an das Objekt gebunden obwohl ausser `lineEditSubjCode` nichts davon später benutzt wird.
In der `Run()`-Methode, die selbst nach Qt-Namenskonventionen `run()` heissen sollte, wird das `lineEditSubjCode`-Attribut neu gebunden und zwar an eine Zeichenkette. Das ist sicher nicht gewollt.
Du brauchst aus dem zweiten Programm nur die Dialog-Klasse und die muss definiert werden bevor sie benutzt wird, also musst Du sicherstellen, dass die ``class``-Anweisung ausgeführt wird bevor Du die Kontrolle mit `exec_()` an die Qt-Hauptschleife übergibst.
Zur `QAction`: Deren `triggered()`-Signal muss mit Code verbunden werden der den Dialog anzeigt. Da könntest Du mal in der Qt-Dokumentation beim `QDialog` den Abschnitt über „Modal Dialogs” lesen.
Der Signalname `DlgSubjectInfoRunSignal` enthält ziemlich viel redundante Information. Die Klasse heisst ja schon `DlgSubjectInfo`, damit würde `RunSignal` völlig ausreichen. Und Signale tatsächlich `Signal` zu nennen ist nicht üblich. Die Signale die es bei den Klassen schon gibt haben diesen Zusatz nicht. Bleibt `run` übrig. Da `run` etwas längerfristiges ist, so ein Signal aber nur einen ”Zeitpunkt” signalisieren kann, würde ich es `started` nennen. Ebenfalls nach dem Muster der ganzen bereits vorhandenen Signale.
In der `DlgSubjectInfo.__init__()` wird ausnahmslos alles an das Objekt gebunden obwohl ausser `lineEditSubjCode` nichts davon später benutzt wird.
In der `Run()`-Methode, die selbst nach Qt-Namenskonventionen `run()` heissen sollte, wird das `lineEditSubjCode`-Attribut neu gebunden und zwar an eine Zeichenkette. Das ist sicher nicht gewollt.
vielen Dank für die schnelle Antwort.
Leider versteh ichs noch nicht wirklich... könntest du mir sagen, wie der Befehl lauten müsste, den ich dann zu "Neuer Subject Code" hinzufügen müsste?
wie definiere ich denn die Dialog Klasse?
Liebe Grüße
Leider versteh ichs noch nicht wirklich... könntest du mir sagen, wie der Befehl lauten müsste, den ich dann zu "Neuer Subject Code" hinzufügen müsste?
wie definiere ich denn die Dialog Klasse?
Liebe Grüße
@pylis: Klassen werden durch Ausfühung einer ``class``-Anweisung definiert. Und das muss halt passieren *bevor* man die Klasse dann verwenden kann.
Es ist auch nicht „ein Befehl” den man hier schreiben muss, sondern den gesamten Code der nötig ist um den Dialog anzuzeigen, und falls man das Modal tun möchte, auch Code um das Ergebnis abzufragen. Und den Code, vorzugsweise in einer Methode, muss man dann mit dem `triggered()`-Signal von dem `QAction`-Exemplar verbinden, damit er aufgerufen wird wenn das Menü mit dieser `QAction` vom Benutzer ausgewählt wird.
Ich habe so ein bisschen den Verdacht, dass Du hier eher anhand von Quelltextbeispielen herum rätst statt ein Programm selber zu entwickeln. Wie gut kannst Du denn die Grundlagen von Python und objektorientierter Programmierung? Womit hast Du das gelernt? Hast Du das Tutorial in der Python-Dokumentation schon mal durchgearbeitet? Welches Qt-Tutorial hast Du bis jetzt verwendet?
Es ist auch nicht „ein Befehl” den man hier schreiben muss, sondern den gesamten Code der nötig ist um den Dialog anzuzeigen, und falls man das Modal tun möchte, auch Code um das Ergebnis abzufragen. Und den Code, vorzugsweise in einer Methode, muss man dann mit dem `triggered()`-Signal von dem `QAction`-Exemplar verbinden, damit er aufgerufen wird wenn das Menü mit dieser `QAction` vom Benutzer ausgewählt wird.
Ich habe so ein bisschen den Verdacht, dass Du hier eher anhand von Quelltextbeispielen herum rätst statt ein Programm selber zu entwickeln. Wie gut kannst Du denn die Grundlagen von Python und objektorientierter Programmierung? Womit hast Du das gelernt? Hast Du das Tutorial in der Python-Dokumentation schon mal durchgearbeitet? Welches Qt-Tutorial hast Du bis jetzt verwendet?