Hallo alle zusammen,
bin neu hier im Forum und beschäftige mich auch erst seit kurzem mit Python.
Als erstes Programm möchte ich einen Geburtstagskalender erstellen, der seine Daten aus einer Datenbank beziehen soll.
Die Datenbank mit den entsprechenden Geburtstagen habe ich bereits.
Das UI habe ich mit Qt Designer erstellt.
Für den Anfang will ich es erstmal nur schaffen, das die Geburtstage aus der Datenbank in dem Kalender angezeigt werden. Das heißt, wenn man ein Datum anklickt zu dem es einen Eintrag gibt, soll dieser in einem Label neben dem Kalender angezeigt werden. Gut wäre auch, wenn die Tage für die ein Eintrag existiert farblich hervorgehoben dargestellt würden.
Ich hab mich schon durch dieses Forum gesucht und auch Google "befragt". Vielleicht benutze ich die falschen Suchbegriffe oder sonst irgendwas, aber ich hab bisher nicht den richtigen Ansatz gefunden.
Würde mich sehr freuen wenn ihr mir auf die Sprünge helfen könntet.
Brauche Hilfe beim erstellen eines Geburtstagskalenders
@scoob99: Die Frage ist ein bisschen allgemein. Wo liegen denn die konkreten Probleme? Ist das Dein erstes Programm? Dann sind Objektorientierung und Datenbank und GUI vielleicht ein bisschen viel auf einmal und Du solltest eventuell überlegen das ganze in Etappen anzugehen. Erst die Programmlogik mit den Geburtsdaten zum Beispiel in einer Textdatei im CSV-Format und einer Textschnittstelle. Wenn das Programm dann soweit steht, könntest Du Dich mit Datenbanken beschäftigen und von der CSV-Datei auf eine Datenbank umstellen. Und als letztes dann die Textschnittstelle mit einer GUI ersetzen.
Das ist zwar mein erstes Python-Programm aber nicht das erste mal das ich mit ner Datenbank arbeite.
Ich habe mich deshalb für diese Vorgehensweise entschieden, weil ich denke das man trotz UI und co. sich von nem kleinen Programm zu nem großen umfangreichen hocharbeiten kann.
Mein Problem ist leider, das ich aufm Schlauch stehe, was den Anfang angeht.
Ich habe mich deshalb für diese Vorgehensweise entschieden, weil ich denke das man trotz UI und co. sich von nem kleinen Programm zu nem großen umfangreichen hocharbeiten kann.
Mein Problem ist leider, das ich aufm Schlauch stehe, was den Anfang angeht.
@scoob99: Wo ist denn das konkrete Problem? Wo kommst Du nicht weiter? Schon ein Python/Qt-Tutorial durchgearbeitet und Dich in die Qt-Dokumentation eingelesen, was zum Beispiel das Konzept von Signal/Slot angeht? Mit welchen Widgets hast Du dir GUI entworfen?
Du kannst dir mal den Quelltext von der Lottoverwaltung anschauen, das ist ja vom Prinzin her ähnlich, nur das die Lottozahlen in einer Datenbank gespeichert werden.
http://github.com/MarkusHackspacher/pyLottoverwaltung
Die Datenbank ist SQlite, die GUI ist pyqt4 und Python 2.7
Dann würde ich in der GUI eine Tabelle mit Zahlen 1-31 generieren lassen und je nach Monat passend sichtbar schalten, die entsprechenden Felder farbig hervorheben und bei Klick darauf werden mehr Infos angezeigt.
Als Beispiel, so werden in dem Lottoprogramm die Zahlen 1 bis 49 angezeigt.
https://github.com/MarkusHackspacher/py ... py#L49-L62
http://github.com/MarkusHackspacher/pyLottoverwaltung
Die Datenbank ist SQlite, die GUI ist pyqt4 und Python 2.7
Dann würde ich in der GUI eine Tabelle mit Zahlen 1-31 generieren lassen und je nach Monat passend sichtbar schalten, die entsprechenden Felder farbig hervorheben und bei Klick darauf werden mehr Infos angezeigt.
Als Beispiel, so werden in dem Lottoprogramm die Zahlen 1 bis 49 angezeigt.
https://github.com/MarkusHackspacher/py ... py#L49-L62
@Malta: Ich guck mir das mit der Lottoverwaltung mal an. Danke schon mal für den Tipp.
@BlackJack: Die GUI habe ich mit dem Qt Designer entworfen. Habe mir dort das Kalender-Widget und nen Label in mein Fenster gepackt. Das Problem ist, das ich bisher nirgends den Ansatz gefunden habe, wie ich dafür sorge, das die Geburtstage aus meiner Datenbank im Kalender angezeigen lassen kann (z.B. durch farbliches Hervorheben).
@BlackJack: Die GUI habe ich mit dem Qt Designer entworfen. Habe mir dort das Kalender-Widget und nen Label in mein Fenster gepackt. Das Problem ist, das ich bisher nirgends den Ansatz gefunden habe, wie ich dafür sorge, das die Geburtstage aus meiner Datenbank im Kalender angezeigen lassen kann (z.B. durch farbliches Hervorheben).
@scoob99: So auf Anhieb habe ich in der Dokumentation die `setDateTextFormat()`-Methode auf `QCalendarWidget` gefunden. Damit könnte man die Daten mit Geburtstagen zum Beispiel Fett formatieren.
Ich konnte mich ne Weile nicht um mein Programm kümmern, aber jetzt sitz ich endlich wieder dran.
@BlackJack: Danke für den Tipp, aber der hilft mir noch nicht.
Einen wichtigen Schritt muss ich vorher noch hinbekommen und da steh ich noch immer aufm Schlauch und weis nicht wie das machen soll. Wie ich die Daten aus der Datenbank auslesen kann weis ich grundsätzlich. Ich weis aber leider nicht wie ich die daraus resultierenden Datumsangaben mit dem aktuellen Datum, bzw. dem angeklickten Datum abgleiche. Mal abgesehen davon, das ich zusätzlich möchte, dass Geburtstage im Kalender-Widget hervorgehoben werden sollen. Wozu ich ja ebenfalls das ganze irgendwie abgleichen muss.
Zudem sollen die Datumsangaben ja nicht nur abgeglichen werden, sondern wenn das Datum passt, soll ja Datum und Name im Label ausgegeben werden.
Die Spalten meiner Datenbank sind folgende: Tag, Monat, Jahr, Name.
Wäre super, wenn mir da auf die Sprünge geholfen werden könnte.
P.S.: Habe die Grundlage meines Programms zwischenzeitlich dahingehend geändert, das ich mein GUI nicht mehr mit dem Qt Designer erstellt habe, sondern direkt mit PyQt geschrieben hab.
@BlackJack: Danke für den Tipp, aber der hilft mir noch nicht.
Einen wichtigen Schritt muss ich vorher noch hinbekommen und da steh ich noch immer aufm Schlauch und weis nicht wie das machen soll. Wie ich die Daten aus der Datenbank auslesen kann weis ich grundsätzlich. Ich weis aber leider nicht wie ich die daraus resultierenden Datumsangaben mit dem aktuellen Datum, bzw. dem angeklickten Datum abgleiche. Mal abgesehen davon, das ich zusätzlich möchte, dass Geburtstage im Kalender-Widget hervorgehoben werden sollen. Wozu ich ja ebenfalls das ganze irgendwie abgleichen muss.
Zudem sollen die Datumsangaben ja nicht nur abgeglichen werden, sondern wenn das Datum passt, soll ja Datum und Name im Label ausgegeben werden.
Die Spalten meiner Datenbank sind folgende: Tag, Monat, Jahr, Name.
Wäre super, wenn mir da auf die Sprünge geholfen werden könnte.
P.S.: Habe die Grundlage meines Programms zwischenzeitlich dahingehend geändert, das ich mein GUI nicht mehr mit dem Qt Designer erstellt habe, sondern direkt mit PyQt geschrieben hab.
Wobei man die 49 Schleifendurchläufe auch *einmal* erledigen kann, anstatt wie bei dir zweimal. Man erstellt sich halt pro Durchlauf einen neuen Button (wie du es ja schon machst), konfiguriert ihn entsprechend und hängt ihn erst dann an die Buttonliste dran. Die sich an verschiedenen Stellen wiederholenden Indexzugriffe auf die Liste und die eigentlich unnötige zweite Schleife sind zwar nicht super laufzeitkritisch oder so, aber eben doch unschön.Malta hat geschrieben:Als Beispiel, so werden in dem Lottoprogramm die Zahlen 1 bis 49 angezeigt.
https://github.com/MarkusHackspacher/py ... py#L49-L62
Das soll dich allerdings nicht davon abhalten, den Threadersteller weiterhin mit Code und Ideen zu unterstützen - nicht dass mein Meckern noch missverstanden wird bzw dich entmutigt.

EDIT: Im Übrigen würde man beim zweiten Durchlauf eher direkt über die Elemente der Liste iterieren und nicht über die Indexwerte.
Habe das mit dem Abgleich der Datumsangaben endlich hinbekommen. Also wenn man jetzt ein Datum anklickt, zu dem ein Eintrag in der Datenbank existiert, wird der Name zum entsprechenden Datum angezeigt.
Bei meinem letzten Problem brauch ich aber unbedingt noch Hilfe, weil ich nicht mal im geringsten weis wie ich das anstellen soll.
Das letzte Problem ist, dass ich möchte, dass man schon beim ersten Blick auf den Kalender sehen kann an welchem Tag ein Eintrag existiert. Also das der entsprechende Tag hervorgehoben wird. Dazu müsste ich jedoch erstmal wissen, wie ich auf die entsprechenden Tage zugreifen kann.
Ich hoffe mir kann da jemand weiterhelfen.
Bei meinem letzten Problem brauch ich aber unbedingt noch Hilfe, weil ich nicht mal im geringsten weis wie ich das anstellen soll.
Das letzte Problem ist, dass ich möchte, dass man schon beim ersten Blick auf den Kalender sehen kann an welchem Tag ein Eintrag existiert. Also das der entsprechende Tag hervorgehoben wird. Dazu müsste ich jedoch erstmal wissen, wie ich auf die entsprechenden Tage zugreifen kann.
Ich hoffe mir kann da jemand weiterhelfen.
Was hast du denn bisher konkret probiert? Quelltext?
Das generelle Vorgehen wäre doch beim Starten des Programms eine DB-Abfrage zu machen, die dir alle eingetragenen Geburtstage zurückgibt. Über diese Liste kannst du dann iterieren und alle Datumseinträge im CalendarWidget mit der von BlackJack schon genannten Methode setDateTextFormat(QDate, QTextCharFormat) grafisch hervorheben.
Das generelle Vorgehen wäre doch beim Starten des Programms eine DB-Abfrage zu machen, die dir alle eingetragenen Geburtstage zurückgibt. Über diese Liste kannst du dann iterieren und alle Datumseinträge im CalendarWidget mit der von BlackJack schon genannten Methode setDateTextFormat(QDate, QTextCharFormat) grafisch hervorheben.
@ EmaNymton: Was das Hervorheben angeht habe ich bisher noch nichts probiert, weil ich noch nicht den richtigen Ansatz gefunden habe. Gerne kann ich hier auch meinen Quelltext posten, aber der umfasst über 170 Zeilen.
Das mit der Liste hab ich schon vermutet, aber ich habe absolut keine Ahnung wie ich das mit dem CalendarWidget abgleichen kann. Könntest du mir das vielleicht als Beispiel posten oder gibts dazu vielleicht schon nen Beispiel, dass ich bisher nur noch nicht gefunden hab?
Das mit der Liste hab ich schon vermutet, aber ich habe absolut keine Ahnung wie ich das mit dem CalendarWidget abgleichen kann. Könntest du mir das vielleicht als Beispiel posten oder gibts dazu vielleicht schon nen Beispiel, dass ich bisher nur noch nicht gefunden hab?
z.B.
Alles aus der Qt-Doku zusammengesucht.
Ergebnis:

Code: Alles auswählen
birthday_format = QtGui.QTextCharFormat()
birthday_format.setForeground(QtGui.QBrush(QtGui.QColor(0, 0, 255)))
dates = [QtCore.QDate(2013,6,22),
QtCore.QDate(2013,6,11),
QtCore.QDate(2013,6,15)]
for date in dates:
self.ui.calendarWidget.setDateTextFormat(date, birthday_format)
Ergebnis:

@EmaNymton: Das ist auf jeden Fall genau das was ich will. Ich hab nur leider keine Ahnung, wie ich die Daten aus der Datenbank so auslese und in die Liste schreibe, dass da genau das Format bei rauskommt, welches in deinem Beispiel gezeigt wird. Zudem möchte ich die Jahreszahl nicht aus der Datenbank beziehen, sondern hätte dort gerne immer das aktuelle Jahr. Es kommt auch noch dazu, das ich die Montaszahl in der Datenbank immer als zweistellige Zahl habe (also z.B.: 06).
Wäre super, wenn du mir dabei auch noch helfen könntest.
Wäre super, wenn du mir dabei auch noch helfen könntest.
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:
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
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)
>>>
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.
@ EmaNymton: Du solltest vorsichtig sein, wenn du eine Zahl mit 0 beginnst. Diese werden als Oktalzahl interpretiert, was durchaus zu Problemen führen kann:
Bei Strings aus der Datenbank ist das natürlich egal, da implizit Dezimalzahlen angenommen werden.
Code: Alles auswählen
>>> 020
16
>>> 09
File "<stdin>", line 1
09
^
SyntaxError: invalid token
Das Leben ist wie ein Tennisball.
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.
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.
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.
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.