Bundesliga Verwaltung mit wxPython und SQLite

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Bundesliga Verwaltung mit wxPython und SQLite

Beitragvon Pumeluk2 » Sonntag 16. März 2008, 11:14

Hallo zusammen,

wie der Titel schon vermuten läßt, geht es hier um ein Programm zur schnellen Verwaltung der ersten Fussball Bundesliga (das müsste dann die zehnmillionste sein die es im Netz gibt, aber das erschien mir eine sinnvolle Aufgabe um sich eine Programmiersprache anzueignen). Die Verzeichnisse und Dateien in dem Ziparchiv müssen in ein Verzeichnis gepackt werden. Hier eine kurze Beschreibung des Archivinhaltes:
/gif - enthält die Wappen der Bundesliga Vereine
/icons - enthält die vom Programm verwendeten Icons
applogic.py - (377 Zeilen) Die Programmlogik, oder die Schicht zwischen Datenbankwrapper und Frontend
createdb.py - (614 Zeilen) Erzeugt eine neue Datenbank. Wird zur Ausführung nicht benötigt, da Datenbank im Archiv enthalten.
dblayer.py - (76 Zeilen) Datenbankwrapper, wird eventuell später ausgetauscht falls ich eine anderes DB-Backend nutzen möchte.
ligadb.s3db - (ca. 25KB) Die SQLite Datenbank der Anwendung.
ligamodules.py (390 Zeilen) Aus dem Hauptprogramm ausgelagerte Widgets.
umbliga.py - (322 Zeilen) Das Hauptprogramm.

Ich habe dem Programm bisher die Versionsnummer 0.0.1 gegeben, das lässt also ahnen wieviel des geplanten Funktionsumfanges ich bereits umgesetzt habe. Trotzdem zeigt das Programm schon einiges an Informationen und Ergebnisse können eingegeben werden und werden natürlich auch verarbeitet. Bis zur Version 1 sollen noch jede Menge Statistiken, ein Editor für die nächsten Jahre (sprich komfortable Eingabe der Mannschaften und des Spielplans, eventuell ein Onlineupdate), Ewige Tabelle und einiges anderes hinzukommen.

Hier gibt es einen Screeshot:
http://www.flickr.com/photos/12002553@N00/2334471897/sizes/o/

Der Downloadlink ist hier:
http://rapidshare.com/files/99929654/umbLiga.zip.html
(Entschuldigung fpr rapidshare, aber ich habe derzeit keine eigene Möglichkeit ein Download anzubieten)

Eine kurze Bedienungsanleitung:
Die Hauptsteuerung geschieht mit drei der vier Buttons rechts oben (der vierte hat noch keine Funktion). Dort kann man sich die einzelnen Spieltage anzeigen lassen und neue Ergebnisse eingeben. Natürlich kommt später ein Menu hinzu, aber für den kleinen Funktionsumfang reichen drei Buttons ;)
Die Art der angezeigten Tabelle kann mit der ComboBox links oben ausgewählt werden.
Durch einen Klick auf einen Verein in der Tabelle wechselt die Spielplananzeige rechts unten und zeigt den Spielplan des markierten Vereins an.

Warum ich das Programm hier schon der (hoffentlich zahlreichen) Kritik aussetze?
Erst einmal komme ich eigentlich aus dem "VB-Lager" und habe mir im laufe der Jahre so ziemlich alle VB typischen Konventionen angeeignet. Sei es Namenskonvention oder Programmierstil. Ich denke mal hier ist das Know-How der mich auf den richtigen Python-Weg bringen kann ;)

So als ehemaliger einsamer VB Programmierer habe ich bisher nach folgendem Motto programmiert:
"It was hard to write the code, it should be hard to read it and impossible to change it" *g*

Deshalb dachte ich ich könnte hier ein paar Anregungen für eine bessere Lesbarkeit meines Codes bekommen. Seien es Doc-Strings (wo ich echt null Inspiration habe wie die aussehen sollten) oder was gelegentliche Kommentare anbelangt. Zwar habe ich es ab und an versucht, aber da gibt es bestimmt jede Menge Optimierungspotential, um es mal positiv zu formulieren.

Ausserdem habe ich das Programm nur unter Linux entwickelt. Mich würde interessieren ob das auf anderen Plattformen ebenfalls so aussieht wie ich mir das gedacht habe. Ich denke mal da könnten einige Probleme auftreten. Leider habe ich privat keine Möglichkeit es auf anderen Systemen zu testen.

Kurz: Kommentare und Kritik ausdrücklich erwünscht. Es reicht ja wenn ihr euch einen kleinen Teil des Quellcodes rauspickt und den hemmungslos niedermacht (OK, positive Kritik war auch schön ;) )

So langer Rede kurzer Sinn:
Danke schon einmal im Vorraus,
Pumeluk2
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 18. März 2008, 19:19

Hallo,

habe mir nur schnell mal den Screenshot angeguckt und sonst noch nichts anderes, aber da tauchte schnell die Frage auf: Darfst Du die Wappen der Vereine mitliefern? Nicht dass ich den Moralapostel spielen will, aber ich denke bei copyrights sollte man sich lieber nicht die Finger verbrennen ;-)
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Beitragvon Pumeluk2 » Dienstag 18. März 2008, 20:13

Die Wappen habe ich von einer Seite die diese Wappen zum Download anbietet. Diese Seite existiert schon ein paar Jahre und meines Wissens ist wieder die DFL, noch der DFB oder ein Verein je gegen diese Seite vorgegangen.

Insofern vermute ich mal das ich das darf. Falls aber Bedenken bestehen, so mache ich noch einmal ein Paket ohne die Wappen.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 18. März 2008, 20:50

Pumeluk2 hat geschrieben:Insofern vermute ich mal das ich das darf.

Nein. Solange sich keiner dran stört ist das kein Problem, aber spätestens wenn du anfangen würdest Geld zu verlangen, würden sich die Copyright und Namensinhaber (!) melden. Daher sind in einigen Spielen die Vereinsnamen und Spielernamen verdreht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Dienstag 18. März 2008, 20:59

Gleich der erste Showstopper:

Code: Alles auswählen

bj@s8n:~/tmp/umbLiga$ ./umbliga.py
Traceback (most recent call last):
  File "./umbliga.py", line 322, in <module>
    main()
  File "./umbliga.py", line 317, in main
    app = UMBLigaMainApplication()
  File "/usr/lib/python2.5/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7700, in __init__
    self._BootstrapApp()
  File "/usr/lib/python2.5/site-packages/wx-2.6-gtk2-unicode/wx/_core.py", line 7352, in _BootstrapApp
    return _core_.PyApp__BootstrapApp(*args, **kwargs)
  File "./umbliga.py", line 310, in OnInit
    frame = UMBLigaMainFrame()
  File "./umbliga.py", line 89, in __init__
    color = convert_syscolor_to_hex()
  File "./umbliga.py", line 38, in convert_syscolor_to_hex
    red = color[0]
TypeError: 'Colour' object is unindexable


Das umwandeln einer ganzen Zahl in Hexadezimaldarstellung braucht man nicht selbst programmieren. Dafür gibt's den Formatierungs-Code '%x' bzw. '%02x' wenn man sicherstellen will, dass die Darstellung zweistellig ist und links mit Nullen aufgefüllt wird. Ausserdem ist Programmieren durch kopieren und einfügen böse ─ diese Umwandlungsfunktion sollte nur in einer Datei stehen.

Ich kenne mich mit `wx` nicht so gut aus, aber ich kann mir nicht vorstellen, dass man zwar Farben als `Colour`-Objekt abfragen kann, die dann aber in eine Zeichenkette umwandeln muss um sie wo anders bei `wx` wieder zu setzen. Das wäre eine ziemlich komische API.

Vergleiche von Wahrheitswerten auf `True` oder `False` sind redundant. Also statt ``if xyz == True:`` kann man nur ``if xyz:`` schreiben und statt ``if xyz == False:`` schreibt man besser ``if not xyz:``.

Dann hast Du eine Menge ``if``/``else`` wo abhängig von der Bedingung ein Wahrheitswert gesetzt wird. Die Auswertung der Bedingung selbst ist doch aber schon ein Wahrheitswert, den man einfach stattdessen benutzen könnte. Beispiel:

Code: Alles auswählen

        if self._currentspieltag == 1:
            self._btnprev.Enable(False)
        else:
            self._btnprev.Enable(True)


lässt sich kürzer so schreiben:

Code: Alles auswählen

        self._btnprev.Enable(self._currentspieltag != 1)


`convert_tblstring_to_tblint()` ist eine sehr umständlich Art die `index()`-Methode auf Listen selbst zu schreiben.
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Beitragvon Pumeluk2 » Mittwoch 19. März 2008, 07:47

@Leonidas: Also Geld verdienen wollte ich damit nicht, sondern nur mit dieser relativ komplexen Aufgabenstellung meine Pythonkentnisse erweitern. Aber falls ihr mir Geld überweisen wollt, dann überleg ich mir das noch einmal :D

@BlackJack: Eigentlich dürfte der Showstopper nicht passieren, da color ein wx.Colour Objekt ist. Aber deine weiteren Anmerkungen machen das Problem 'eh überflüssig.

Das umwandeln einer ganzen Zahl in Hexadezimaldarstellung braucht man nicht selbst programmieren.


Das nennt man Betriebsblindheit meinerseits. War wahrscheinlich zu einfach um es zu finden ;)

Ich kenne mich mit `wx` nicht so gut aus, aber ich kann mir nicht vorstellen, dass man zwar Farben als `Colour`-Objekt abfragen kann, die dann aber in eine Zeichenkette umwandeln muss um sie wo anders bei `wx` wieder zu setzen. Das wäre eine ziemlich komische API.


Ups :oops: Stimmt, ich kann den Wert von wx.GetSystemSettings.GetColour direkt übergeben. Damit ist die ganze Konvertiererei schon mal hinfällig. Danke für den Tipp - da ist halt noch zuviel VB-Denke in mir (da musste man solche Verrenkungen hin und wieder machen).

Ausserdem ist Programmieren durch kopieren und einfügen böse ─ diese Umwandlungsfunktion sollte nur in einer Datei stehen.


Das hatte ich nachdem ich das hier gepostet habe auch entdeckt und bereits geändert. War aber vergebliche Mühe da ich mir die Konvertierung nun komplett sparen kann ;)

Vergleiche von Wahrheitswerten auf `True` oder `False` sind redundant.


Stimmt, das werde ich auch ändern.

Die Auswertung der Bedingung selbst ist doch aber schon ein Wahrheitswert, den man einfach stattdessen benutzen könnte.


*grummel* Darauf hätte ich selber kommen können.

`convert_tblstring_to_tblint()` ist eine sehr umständlich Art die `index()`-Methode auf Listen selbst zu schreiben.


Da ich diesen "Hack" ;) ebenfalls unschön finde, habe ich dem ganzen diesen häßlichen Namen gegeben. Allerdings wird die ComboBox zur Auswahl der Tabelle noch in zwei oder drei weiteren Fenstern erscheinen (deshalb habe ich sie auch ausgelagert) und die Umwandlung des Textwertes (z.B. Gesamttabelle = 1) demzufolge auch noch einige male nötig sein. Vielleicht mache ich daraus ein Dictionary und greife über den Key darauf zu ...

Danke für den Aufwand deinerseits, ich werde das nach Feierabend umsetzen. Jetzt muss ich aber wieder Oracle administrieren gehen ;)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder