Fußball "Manager"

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
12345z
User
Beiträge: 4
Registriert: Dienstag 6. September 2011, 16:32

Der Threadtitel könnte ein falschen Eindruck erwecken, deswegen auch die Gänsefüßchen um das Manager.

Da ich öfters mal eine kleine Runde Fifa/Pes oä. an nem gemütlichen Abend gegen Freunde daddel, dachte ich, sollte es doch mal eine Alternative zur Stift&Papier-Methode geben (ich rede vom Notieren der Ergebnisse :D).

Folgende Funktionen sollen implementiert werden bzw. sind schon großteils:
Spieler hinzufügen (Name; Regdatum, Tordifferenz und Lieblingsmannschaft werden auch ermittelt)
Spieler löschen
Informationen zu Spielen anzeigen (letzte x Matches usw)

Match hinzufügen (wer gegen wen mit welcher Mannschaft jeweils, Ergebnis und Datum)
Match löschen


Von der Struktur her wird es eine Abwandlung von MVP (werd mich sicherlich nicht an alles halten können :D).
GUI wurde mit Qt4 erstellt und liegt als *.ui vor, die dynamisch geladen wird.
Das komplette Backend (eine Klasse, die die Zugriffe auf ein Mysqlite-File handhabt) ist schon fertig. Dort sind auch bereits alle Hauptfunktionen implementiert.

Die Brücke zwischen GUI und Logik wird mit einer Klasse geschaffen, die beides via pubsub (http://pubsub.sourceforge.net/) verknüpft.

die Logik ist bis jetzt leider noch alles, was beinahe 100%ig fertig ist. Auf Qt bin ich erst seit Heute eingeganen (davor wx-Jünger) und habe schonmal eine provisorische GUI geschaffen, die auch geladen wird, aber sonst funktionslos ist.

Download: http://uploaded.to/file/e9g9ad9g (die starter.py starten)
PyQt4 und pubsub wird vorrausgesetzt!

Freue mich auf Anregungen und Kritik bzgl. dem Code.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

klingt erst einmal interessant :-)

Aber: Könntest Du das ganze nicht per bitbucket / github o.ä. zur Verfügung stellen? Das wäre mir persönlich angenehmer, als eine rar-Datei von irgend wo herunter zu laden (zumal rar imho eh gemieden gehört ;-) ).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12345z
User
Beiträge: 4
Registriert: Dienstag 6. September 2011, 16:32

Den Wunsch kann ich dir so zwar nicht erfüllen, hab es aber mal auf sourceforge veröffetnlicht.
https://sourceforge.net/p/pyfootballmngr/
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, Sourceforge ist sicherlich besser als nix ;-)

Ich bekomme pysubpub leider nicht installiert; easy_install meckert leider rum:

Code: Alles auswählen

Searching for pypubsub
Reading http://pypi.python.org/simple/pypubsub/
Reading http://pubsub.sourceforge.net
Reading http://sourceforge.net/projects/pubsub/files/pubsub/3.1.1b1/
Reading http://pubsub.wiki.sourceforge.net
Reading http://sourceforge.net/project/showfiles.php?group_id=197063
Best match: PyPubSub 2.0
Downloading http://pypi.python.org/packages/source/P/PyPubSub/PyPubSub-2.0.zip#md5=8805193fcc23dbd5f760e152932b50ab
Processing PyPubSub-2.0.zip
Running PyPubSub-2.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-xn8yQx/PyPubSub-2.0/egg-dist-tmp-XkC2EQ
Traceback (most recent call last):
  File "/usr/bin/easy_install", line 9, in <module>
    load_entry_point('distribute==0.6.15', 'console_scripts', 'easy_install')()
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1906, in main
    with_ei_usage(lambda:
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1887, in with_ei_usage
    return f()
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1910, in <lambda>
    distclass=DistributionWithoutHelpCommands, **kw
  File "/usr/lib/python2.7/distutils/core.py", line 152, in setup
    dist.run_commands()
  File "/usr/lib/python2.7/distutils/dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "/usr/lib/python2.7/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 363, in run
    self.easy_install(spec, not self.no_deps)
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 603, in easy_install
    return self.install_item(spec, dist.location, tmpdir, deps)
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 633, in install_item
    dists = self.install_eggs(spec, download, tmpdir)
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 823, in install_eggs
    return self.build_and_install(setup_script, setup_base)
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1100, in build_and_install
    self.run_setup(setup_script, setup_base, args)
  File "/usr/lib/python2.7/dist-packages/setuptools/command/easy_install.py", line 1089, in run_setup
    run_setup(setup_script, args)
  File "/usr/lib/python2.7/dist-packages/setuptools/sandbox.py", line 29, in run_setup
    lambda: execfile(
  File "/usr/lib/python2.7/dist-packages/setuptools/sandbox.py", line 70, in run
    return func()
  File "/usr/lib/python2.7/dist-packages/setuptools/sandbox.py", line 31, in <lambda>
    {'__file__':setup_script, '__name__':'__main__'}
  File "setup.py", line 2, in <module>
ImportError: No module named ez_setup
An sich zwar eine nette Idee, aber wozu braucht man das im Qt-Umfeld? Dort gibt es ja grad das Signal / Slot-Konzept, welches auf den ersten Blick ziemlich genau das tut, was dieses Paket auch bieten will.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Es gibt keine README und im Wiki scheint sich auch nichts zu befinden. Es ist weder eine COPYRIGHT / LICENSE noch eine setup.py vorhanden. Wie soll ich das Programm installieren? Wie soll ich es starten? Wie soll ich es benutzen? Welche Aufgabe oder welchen Sinn hat der .idea Ordner?

Edit: OK, in deinem Ausgangspost steht "starter.py" starten. Sollte aber auch in der README stehen, die sich in dem root-Verzeichnis des Projekts befinden sollte.
12345z
User
Beiträge: 4
Registriert: Dienstag 6. September 2011, 16:32

Ist das erste mal, dass ich mit svn und co. rumhantiere.
An die pypubsub Geschichte dachte ich, weil ich die Events selber so weit wie möglich von dem GUI-Framework abgekoppelt haben möchte.
Jedenfalls schau ich mir gerade mal an, wie man ein Model für die QTableView-Komponente erstellt.

Über Feedback zum Code würde ich mich freuen.
deets

Der Code ist soweit sauber & ok, aber ja auch nicht wirklich komplex.

Dein Wunsch nach Entkopplung vom GUI-Framework in allen Ehren, aber wie Hyperion schon sagt - bei Qt macht man das mit Signal/Slot (die ja im uebrigen erstmal nichts mit GUI zu tun haben). Davon nun unbedingt abstrahieren zu wollen wuerde nur Sinn machen bei einer Kern-Komponente, die in verschiedenen Kontexten eingesetzt werden soll, und bei der dann auch auf keinen Fall Qt zum Einsatz kommen darf (GUI-los, nur mit QObject).

Ist also etwas ueberkandidelt, und solltest du dir sparen. Es *ist* ja nunmal eine GUI-Anwendung in Qt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Qt bietet Dir von Haus aus ein SQL-Modul an; damit könntest Du Dir Deine eigene Abstraktionsschicht sparen. Wenn Du nicht zu viel Qt (ist ja mehr als nur GUI-Toolkit) bei Dir haben möchtest, dann kannst Du Dir ja mal SQLAlchemy oder Elixir angucken. So eine eigen Abstraktionsschicht ist eigentlich selten sinnvoll.

Ansonsten ist ja nicht viel Code zu sehen ehrlich gesagt... diese Event-Message-Sache dürfte imho durch Qt entfallen. Ereignisse sind doch immer GUI spezifisch - zumindest bei Deinem Anwendungsfall.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12345z
User
Beiträge: 4
Registriert: Dienstag 6. September 2011, 16:32

Dankescön für das Feedback. Ich verstehe das Prinzip mit den Slots schon. Kann mir jemand eine Erklärung geben, wie ich dadurch dann den Presenter am besten benachrichtige, falls sich in der GUI-Klasse etwas tut?


EDIT: Bin nun soweit, dass ich im Presenter die actions so verknüpfe:

Code: Alles auswählen

    def connect_layers(self):
        self.main_window.actionAdd_Player.triggered.connect(self.player_new)
        self.main_window.actionRemove_Player.triggered.connect(self.player_delete)
        self.main_window.actionAdd_Match.triggered.connect(self.match_new)
        self.main_window.actionRemove_Match.triggered.connect(self.match_delete)
        self.main_window.actionExit.triggered.connect(self.exit)

Jetzt hab ich allerdings das Problem mit dem Übergeben von Argumenten aus der View. Wie lös ich das? Die View sollte den Presenter auf keinen Fall "kennen".


EDIT2: Hat sich erledigt. Hab pypubsub nun rausgeschmissen und es mit den Slots gelöst.


Gruß
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Habe dein Programm getestet, leider kann ich keinen Spieler oder Spiel hinzufügen oder löschen.

Bekomme diese Fehlermeldungen.

Code: Alles auswählen

pyfootballmngr-code$ ./pyfootballmngr.py 
<PyQt4.QtCore.QModelIndex object at 0x7ff71f504210>
<PyQt4.QtCore.QModelIndex object at 0x7ff71f504590>
Traceback (most recent call last):
  File "/home/mar/workspace/python/src/footballmng/pyfootballmngr-code/modules/main.py", line 61, in new_player
    dlg = DlgNewPlayer(self.data_handler.insert_user)
TypeError: __init__() takes exactly 1 argument (2 given)
<PyQt4.QtCore.QModelIndex object at 0x7ff71f504590>
Von Programm selbst finde ich es gut wie due es gelöst hast mit der SQlite Datenbank, ich selbst bin dabei eine Lottoverwaltung zu erstellen, die ebenfalls Qt4 und SQlite verwendet.
http://www.python-forum.de/viewtopic.php?f=6&t=28700

Die Datei pyfootballmngr-code/modules/gui/dialogs/newplayer.py sollte so aussehen.

Code: Alles auswählen

class DlgNewPlayer(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        
        self.setWindowIcon(QtGui.QIcon(join("misc", "icon.ico")))
        self.setModal(True)
        self.buttonBox = QtGui.QDialogButtonBox(self)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)

        self.txtName = QtGui.QLineEdit(self)
        self.label = QtGui.QLabel(self)


        self.boxLayout = QtGui.QBoxLayout(QtGui.QBoxLayout.TopToBottom, self)

        gridLayout = QtGui.QGridLayout()
        gridLayout.addWidget(self.label, 0, 0, 1, 1)
        gridLayout.addWidget(self.txtName, 0, 1, 1, 1)
   
        self.boxLayout.addLayout(gridLayout)
        self.boxLayout.addWidget(self.buttonBox)


        self.label.setText("Username")
        self.setWindowTitle("New Player Dialog")
        self.txtName.setFocus()


        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.close)

    def getValues(self):
        return str(self.txtName.text())
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

12345z hat geschrieben: Folgende Funktionen sollen implementiert werden bzw. sind schon großteils:
Spieler hinzufügen (Name; Regdatum, Tordifferenz und Lieblingsmannschaft werden auch ermittelt)
Spieler löschen
Informationen zu Spielen anzeigen (letzte x Matches usw)

Match hinzufügen (wer gegen wen mit welcher Mannschaft jeweils, Ergebnis und Datum)
Match löschen
...
Freue mich auf Anregungen und Kritik bzgl. dem Code.
Habe mir deinen Code nochmals angeschaut und um die gewünschten Funktionen erweitert:
Spieler hinzufügen/ändern/löschen
Informationen zu Spielen anzeigen
Match hinzufügen/löschen
About hinzugefügt

https://github.com/MarkusHackspacher/pyfootballmngr
Antworten