Brauche Hilfe beim erstellen eines Geburtstagskalenders

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Ich weiß nicht, welche/ob du eine Datenbank verwendest, aber wenn du weißt, wie du die Daten abfragst, sollte es doch kein Problem sein aus dem Monat und dem Tag ein QDate-Objekt zu erzeugen:

Code: Alles auswählen

>>> from PySide import QtCore
>>> date_now = QtCore.QDate().currentDate()
>>> date_now.year()
2013
>>> date_test = QtCore.QDate(date_now.year(), 01, 01)
>>> date_test
PySide.QtCore.QDate(2013, 1, 1)
>>> 
FALSCH (s.u.): (Du siehst, dass zweistellige Angaben bei Tag und Monat nicht ein Problem sind und einfach beim Konstruieren verwendet werden können.)
Das Jahr abfragen kann man natürlich auch ohne Qt und nur mit dem Python-Modul datetime machen, das findet man aber in der Dokumentation: http://docs.python.org/2/library/datetime.html
Zuletzt geändert von EmaNymton am Montag 24. Juni 2013, 16:54, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@ EmaNymton: Du solltest vorsichtig sein, wenn du eine Zahl mit 0 beginnst. Diese werden als Oktalzahl interpretiert, was durchaus zu Problemen führen kann:

Code: Alles auswählen

>>> 020
16
>>> 09
  File "<stdin>", line 1
    09
     ^
SyntaxError: invalid token
Bei Strings aus der Datenbank ist das natürlich egal, da implizit Dezimalzahlen angenommen werden.
Das Leben ist wie ein Tennisball.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Danke für den Hinweis, du hast natürlich Recht. Ich hatte angenommen, dass der Konstruktor von einem QDate-Objekt das richtig interpretiert, aber ab 08 geht's tatsächlich schief.
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Was das mit der 0 angeht, gibt mein Programm schon bei 06 ein SyntaxError aus.

Was das Auslesen aus der Datenbank angeht, steh ich gerade total aufm Schlauch. Ich hab mir jetzt schon so einiges angeguckt, aber nichts scheint die richtige Lösung für mein Programm zu sein.
Ich benutze für die Datenbank sqlite3.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Welches Modul verwendest du denn? Das von Qt oder das sqlite-modul aus der Python-Standardlib?

Ich glaube deine Herangehensweise an die Sache ist nicht zielführend und es bringt dir auch nichts, wenn dir jemand hier für jeden kleinen Schritt die Hand gibt. Du machst zu viele Baustellen auf einmal auf.
Für dein Programm in der jetzigen Form halte ich z.B. eine DB für overkill, eine einfachere Art die Daten zu speichern wäre hier angebracht, z.B. in Form einer CSV-Datei. Damit ist man erstmal wieder bei Grundlagen, die man zuerst verstehen sollte, bevor man Datenbanken verwendet.
Das ist nicht böse gemeint, aber so wirst du mMn auf lange Sicht keinen Spaß am Programmieren haben, wenn du für grundlegende Sachen immer wieder nachfragen musst.
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

Ich benutze das sqlite-modul aus der Python Standardlib.
Mein Problem ist nicht unbedingt die Datenbank, sondern eher, dass ich mit Schleifen in dem Umfang wie ich sie für diese Abfrage brauche noch ziemlich auf Kriegsfuß stehe. Deshalb denke ich das es besser ist, wenn ich das so mache, wie ich es gerade mache. Wenn ich mich da nicht so rantraue nur weil ich niemanden fragen möchte, dann lern ich es wohl möglich nie.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Mein Problem ist nicht unbedingt die Datenbank, sondern eher, dass ich mit Schleifen in dem Umfang wie ich sie für diese Abfrage brauche noch ziemlich auf Kriegsfuß stehe.
Und das verstehe ich unter Grundlagen. Außerdem liest du nicht die Dokumentation, denn da ist beschrieben, wie man über eine SQL-Abfrage iteriert: http://docs.python.org/2/library/sqlite3.html

Das könnte dann in deinem Fall so aussehen, wenn ich das mal in IDLE runterschreibe:

Code: Alles auswählen

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c =conn.cursor()
>>> c.execute('''CREATE TABLE birthdays
             (year int, month int, day int, name text)''')
<sqlite3.Cursor object at 0x14b4a40>
>>> birthdays = [(2013, 6, 1, "Klaus"), (2013, 6, 23, "Gabi")]
>>> c.executemany('INSERT INTO birthdays VALUES (?,?,?,?)', birthdays)
<sqlite3.Cursor object at 0x14b4a40>
>>> for row in c.execute('SELECT * FROM birthdays'):
        print row

(2013, 6, 1, u'Klaus')
(2013, 6, 23, u'Gabi')
>>> dates = []
>>> from PySide import QtCore
>>> for year, month, day, name in c.execute('SELECT * FROM birthdays'):
        dates.append(QtCore.QDate(year, month, day))

>>> dates
[PySide.QtCore.QDate(2013, 6, 1), PySide.QtCore.QDate(2013, 6, 23)]
Ich habe die Befehle, die auf der oben verlinkten Seite stehen, fast 1:1 kopiert und nur an die Gegebenheiten angepasst, dass es sich hier um Jahr, Monat und Tag handelt und das sinnvollerweise ganze Zahlen sein sollten, wobei man auch darüber nachdenken könnte, direkt das als Datum in der DB zu speichern, aber das ist eben eine Design-Frage.
In deinem Programm solltest du das natürlich noch ein wenig in Methoden strukturieren, ich wollte dir nur zeigen, dass es wirklich in ganz vielen Fällen damit getan ist, sich mal 30 Minuten Zeit zu nehmen und die Dokumentation zu lesen. :wink:
scoob99
User
Beiträge: 17
Registriert: Montag 10. Juni 2013, 17:15

@EmaNymton: Da hab ich offensichtlich mehr als nur nen bisschen aufm Schlauch gestanden. Tut mir leid wegen der Umstände die ich dir bereitet habe.
Aber auf jeden Fall vielen vielen Dank. Jetzt funktionierts so wie es soll.
Antworten