Projekt Meisterhilfe

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hi Alle,

Ich bin Anfänger in Sachen Python-Qt aber habe ausreichende C++ Erfahrungen.
Mein derzeitiges Projekt welches ich in PyQt programmieren will, stellt ein paar Probleme,

Code: Alles auswählen

#!/usr/bin/env python
#
#hauptfenster.py
#
import sys
from PyQt import *
sys.path.append('./module/sys')
from workspace import *

class Hauptfenster(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.workspace=Workspace(self)
        self.setCentralWidget(self.workspace)
        self.connect(self.workspace, SIGNAL("clicked()"),
                            self.updateMenus())
        win.setWindowTitle(tr("Meisterhilfe"))
        self.createMenus()

    def updateMenus(self):
        pass

    def createMenus(self):
        pass
    
def main(args):
    app=QApplication(args)
    win=Hauptfenster()
    win.show()
    app.connect(app, SIGNAL("lastWindowClosed()"),
                        app, SLOT("quit()"))
    app.exec_loop()
Ich neheme an das mir Packete unter Debian Etch fehlen, daher kennt er so einiges was ich oben benutzte nicht.
Welche Packete benötige ich unter Debian Etch?
Zeile 16 und 18 geben nur Fehler aus.
Die Packete "python-qt3" und "python-qt4" sind bei mir bereits installiert.

Mein Hauptprogramm sieht wie folgt aus,

Code: Alles auswählen

#!/usr/bin/env python
#
#startGUI.py
#
import os
import sys
sys.path.append('./module/sys')
import hauptfenster

if os.name == 'posix':
    print "Linux System wurde erkannt."
    print "Starte meisterhilfe Programm."
    if __name__ == "__main__":
        hauptfenster.main(sys.argv)
    
elif os.name == 'nt':
    print "Windows System wurde erkannt."
    print "Starte meisterhilfe Programm."
else:
    print "Konnte Betriebssystem nicht erkennen ! ! !"
    print "Das Programm meisterhilfe wurde nicht gestartet."

Grüße Markus
Zuletzt geändert von feldmaus am Freitag 29. Februar 2008, 12:15, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Interessant waren mal die Fehlermeldungen ;)
/dev/kristallkugel sagt mir nämlich so nichts!
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Zunächst mal werden sich bei einigen sicher die Nackenhaare aufstellen wegen den Sternchen Imports. Das hab ich auch kürzlich gelernt ;)

Als nächstes importierst du PyQt, damit dürftest du wohl auf Qt3 zugreifen, nicht auf Qt4. Ich denke nicht das dir was fehlt sondern das du self.SIGNAL bzw self.tr verwenden musst. Ist jetzt aber ins Blaue geraten

Ich empfehle Dir mal einen Blick auf die Exampels die mitgeliefert werden (sollten)

/usr/share/doc/python-qt4-doc/examples/

hier mal ein einfaches Beispiel

Code: Alles auswählen

#!/usr/bin/env python

# PyQt tutorial 4


import sys
from PyQt4 import QtCore, QtGui


class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setFixedSize(200, 120)

        self.quit = QtGui.QPushButton("Quit", self)
        self.quit.setGeometry(62, 40, 75, 30)
        self.quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))

        self.connect(self.quit, QtCore.SIGNAL("clicked()"),
                     QtGui.qApp, QtCore.SLOT("quit()"))


app = QtGui.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())

Code: Alles auswählen

import sys
from PyQt4 import QtCore, QtGui

import dockwidgets_rc


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        
        self.textEdit = QtGui.QTextEdit()
        self.setCentralWidget(self.textEdit)
        
        self.createActions()
        self.createMenus()
        self.createToolBars()
        self.createStatusBar()
        self.createDockWindows()
        self.setWindowTitle(self.tr("Dock Widgets"))
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

feldmann_markus hat geschrieben: Welche Packete benötige ich unter Debian Etch?
Ich habe die Packete,
python-qt-dev
python-qt4-dev
installiert.

Allerdings zeigt er mir den foldenden Fehler an,
  • TypeError: argument 3 of QObject.connect() has an invalid type
BlackJack

Da sollte man wahrscheinlich eine Funktion/Methode angeben. Du übergibst in Zeile 17 im ersten Beitrag aber das `None`-Objekt weil das der Rückgabewert der Methode ist, die Du *aufrufst*. Das solltest Du lassen. :-)
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

burli hat geschrieben: Als nächstes importierst du PyQt, damit dürftest du wohl auf Qt3 zugreifen, nicht auf Qt4.
Nach ein paar Änderungen habe ich den Pfaden verloren und Fehler gewonnen. :-)
Tut mir leid Jungs ich bin Heute irgendwie verwirrt.
  • ImportError: No module named PyQt

Code: Alles auswählen

#!/usr/bin/env python
#
#hauptfenster.py
#
import sys
from PyQt import QtCore, QtGui 
sys.path.append('./module/sys')
import workspace

class Hauptfenster(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.workspace=workspace.Hauptworkspace(self)
        self.setCentralWidget(self.workspace)
        self.connect(self.workspace, SIGNAL("clicked()"),
                            self.updateMenus(self))
        win.setWindowTitle(self.tr("Meisterhilfe"))
        self.createMenus()

    def updateMenus(self):
        pass

    def createMenus(self):
        pass
    
def main(args):
    app=QApplication(args)
    win=Hauptfenster()
    win.show()
    app.connect(app, SIGNAL("lastWindowClosed()"),
                        app, SLOT("quit()"))
    app.exec_loop()

Code: Alles auswählen

#!/usr/bin/env python
#
#workspace.py
#
import sys
from PyQt import QtCore, QtGui 

class Hauptworkspace(QWorkspace):
    def __init__(self, *args):
        apply(QWorkspace.__init__, (self,) +args)
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Muss PyQt4 heißen denke ich mal
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ihr seid mir fast zu schnell mit den Antworten. :-)
Ich werde mir das Beispiel "mdi.py" aus,
/usr/share/doc/python-qt4-doc/examples/mainwindows/mdi
nochmal genauer angucken.

Grüße Markus
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ja muss es! ;)
BlackJack

@feldmann_markus: Deine letzte Zeile 17 ist ja noch "fälscher". Jetzt rufst Du die Methode nicht nur auf, sonder gibst ihr auch noch ein Argument mit, dass sie gar nicht erwartet.

Falls Du objektorientierte Programmierung noch nicht drauf hast, solltest Du das unbedingt lernen *bevor* Du anfängst Dich mit GUIs zu beschäftigen.
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

feldmann_markus hat geschrieben:Allerdings zeigt er mir den foldenden Fehler an,
  • TypeError: argument 3 of QObject.connect() has an invalid type
Statt:

Code: Alles auswählen

self.connect(self.workspace, SIGNAL("clicked()"), 
    self.updateMenus(self)) 
so:

Code: Alles auswählen

self.connect(self.workspace, SIGNAL("clicked()"),
    self.updateMenus) 
(Has Du auch Python-qt4 installiert?)

Gruß

GnuShi
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Die benötigten Pakete heißen in debian:
python-qt4 bzw python-qt3

Sie sind beide in Etch enthalten:
Debian Paketsuche nach python-qt
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben: Falls Du objektorientierte Programmierung noch nicht drauf hast, solltest Du das unbedingt lernen *bevor* Du anfängst Dich mit GUIs zu beschäftigen.
Ich sehe das so,
wer Fehler macht der lernt. :-)
Auch Kinder kannst du nicht immer hinterher laufen um sie vor allen Gefahren zu schützen, sie müßen manchmal einfach die Hand ins Feuer halten um zu lernen das Feuer gefährlich ist. Besser ist es dem Kind zu erklären warum es gefährlich ist als zu sagen lass das.

Wenn ich was falsch gemacht habe sage mir was ich falsch gemacht habe und warum das falsch ist. :D Ich habe C++ gelernt, war allerdings nicht der Hellste. Ich traue mir aber viel zu. Schakka ich schaff das. :-)
Zuletzt geändert von feldmaus am Freitag 29. Februar 2008, 22:34, insgesamt 1-mal geändert.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Mr_Snede hat geschrieben:Die benötigten Pakete heißen in debian:
python-qt4 bzw python-qt3
Beide habe ich. Die Devel Packete sind glaube ich auch notwendig.
Weiss Jemand wie ich Eric3 konfigurieren muß damit er mit PyQt4 zusammenarbeitet?
Ich habe die Beispiele von "Python-qt4-doc" einmal mit Eric3 gestartet und danach in der Konsole. In der Konsole gings und bei Eric3 hat er einen Fehler raußgeschmissen.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Wieso Eric3? Eric3 ist Qt3, Eric4 ist Qt4. Ich würde einfach mal sagen vergiss Qt3 und konzentrier dich auch Qt4

Für Eric4 braucht man allerdings einiges. vorher brauchst du noch Sip4 und Qscintilla, jeweils die aktuellste Version. Ist alles hier zu finden
BlackJack

@feldmann_markus: Ich habe doch gesagt was Du falsch gemacht hast, Du hast OOP nicht so ganz verstanden. ;-)

Wobei der Unterschied zwischen Funktion übergeben oder Funktion aufrufen und Rückgabewert übergeben in C++ genau der gleiche ist. Sogar syntaktisch.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:@feldmann_markus: Deine letzte Zeile 17 ist ja noch "fälscher". Jetzt rufst Du die Methode nicht nur auf, sonder gibst ihr auch noch ein Argument mit, dass sie gar nicht erwartet.
Stimmt. War ein grober Fehler von mir.
Aber was ich nicht verstehe ist warum ich folgendes schreiben darf,

Code: Alles auswählen

        self.connect(self.workspace, SIGNAL("clicked()"),
                            self.updateMenus)
aber nicht,

Code: Alles auswählen

        self.connect(self.workspace, SIGNAL("clicked()"),
                            self.updateMenus())
Im zweiten Beispiel wird doch kein Argument übergeben?
Und das "None" übergeben wird, wird wohl eher nur in Python der Fall sein, denke ich?!
Werde es mir fürs nächste mal merken. :-)
BlackJack

Im zweiten Fall wird die Methode *aufgerufen* und `None` wird nicht übergeben, sondern von der Methode zurückgegeben.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

BlackJack hat geschrieben:Im zweiten Fall wird die Methode *aufgerufen* und `None` wird nicht übergeben, sondern von der Methode zurückgegeben.
:idea: :roll: :idea: Verstanden :D
Und im ersten Fall nicht? Da werde ich nochmal im Python Buch nachlesen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

feldmann_markus hat geschrieben:Und im ersten Fall nicht? Da werde ich nochmal im Python Buch nachlesen.
Da wird nur die Referenz übergeben. Kannst du auch ganz einfach im Interpreter ausprobieren, tippe einfach mal ``print list`` und ``print list()`` ein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten