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 ).
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 ).
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.
Fußball "Manager"
- 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 ).
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
assert encoding_kapiert
Den Wunsch kann ich dir so zwar nicht erfüllen, hab es aber mal auf sourceforge veröffetnlicht.
https://sourceforge.net/p/pyfootballmngr/
https://sourceforge.net/p/pyfootballmngr/
- 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:
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.
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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
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.
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.
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.
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.
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.
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.
- 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.
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
assert encoding_kapiert
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:
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ß
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ß
Habe dein Programm getestet, leider kann ich keinen Spieler oder Spiel hinzufügen oder löschen.
Bekomme diese Fehlermeldungen.
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.
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>
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())
Habe mir deinen Code nochmals angeschaut und um die gewünschten Funktionen erweitert: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.
Spieler hinzufügen/ändern/löschen
Informationen zu Spielen anzeigen
Match hinzufügen/löschen
About hinzugefügt
https://github.com/MarkusHackspacher/pyfootballmngr