simple reminder

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hallo,

ja ich weiß... es gibt sowas schon zu Hauf. Aber ich habe mich trotzdem rangesetzt und heute einen "Reminder" geschrieben, also ein Programm das kleine "Notizzettelchen" auf den Desktop packt, wenn etwas ansteht.

Ich habe es gerade soweit das es benutzbar ist. Eintraege sind erstell- und loeschbar, aber noch nicht editierbar. Es muss im Moment noch mindestens ein Eintrag vorhanden sein, damit das Programm ueberhaupt startet (dieser wird Anfangs automatisch erstellt, wenn noch keine Datenbank vorliegt). Die Eintraege selbst sind in gepickleter Form unter <HEIMVERZEICHNISS>\.reminderdb zu finden. Bisher lese ich nur die Umgebungsvariablen von Windows aus, Linux werde ich morgen oder so nachtragen.

Entwickelt mit Python 2.5.1 und wxPython 2.8

Alles weitere sollte schnell rauszufinden sein, indem man das Programm einfach mal ausfuehrt ;)

Bitteschoen (v0.2.5 development snap vom 10.01.2008):
http://paste.pocoo.org/show/20403/


Gruesse
NKoehring

PS: Ich bitte wie immer um Kritik und Verbesserungsvorschlaege ;)
Zuletzt geändert von nkoehring am Donnerstag 10. Januar 2008, 06:48, insgesamt 1-mal geändert.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Komisch, ich dachte Windows hat so etwas wie ``%HOME%``, so dass man nicht den Pfad selbst zusammensetzen muss.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Leonidas hat geschrieben:Komisch, ich dachte Windows hat so etwas wie ``%HOME%``, so dass man nicht den Pfad selbst zusammensetzen muss.
Also wenn, dann steht es nicht in os.environ :(
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Code: Alles auswählen

if  now() >= date-daysbefore and now() <= date:
date-daysbefore wirkt für mich wie ein Name.

Code: Alles auswählen

self.date = date[:4]+'-'+date[4:6]+'-'+date[6:]+" ("+tage+")"
finde ich so übersichtlicher:

Code: Alles auswählen

self.date = '%s-%s-%s (%s)' % (date[:4], date[4:6], date[6:], tage)
ansonsten fände ich auch hier Leerzeichen hilfreich.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

nkoehring hat geschrieben:Also wenn, dann steht es nicht in os.environ :(
Du kannst ``os.path.expanduser('~/pfad')`` verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Leonidas hat geschrieben:Du kannst ``os.path.expanduser('~/pfad')`` verwenden.
Oh, das ist natuerlich besser, danke Leonidas :)

mkallas hat geschrieben:

Code: Alles auswählen

if  now() >= date-daysbefore and now() <= date:
date-daysbefore wirkt f�r mich wie ein Name.
Ja dann zauber ich mal ein paar Leerzeichen dazwischen :oops:

mkallas hat geschrieben:

Code: Alles auswählen

self.date = date[:4]+'-'+date[4:6]+'-'+date[6:]+" ("+tage+")"
finde ich so �bersichtlicher:

Code: Alles auswählen

self.date = '%s-%s-%s (%s)' % (date[:4], date[4:6], date[6:], tage)
ansonsten f�nde ich auch hier Leerzeichen hilfreich.
Weißt du was... das mach ich einfach ganz anders ;)

Code: Alles auswählen

self.date = time.strftime( "%Y-%m-%d", time.strptime(date, "%Y%m%d") )
self.date += " (%s)" %tage
size = wx.Size(self.fullwidth, self.fullheight)
----

Nachher lade ich die aktuelle Version hoch... diese bietet:
  • mehr Konfigurationsmoeglichkeiten (wenn auch noch im Quelltext)
  • ein paar Bugfixes
  • an manchen Stellen etwas schoeneren Code ;)
Gruß
NKoehring
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Ehm... ich wuerde gern vernuenftig mit dem Datum rechnen... ich koennte schwoeren, es gab hier dazu mal was im Forum, aber ich find es gerade nicht.

Gibt es ein Modul, dass vernuenftige Moeglichkeiten bietet, mit Daten zu rechnen?
Also zB "2008-01-03" - 5 Tage = "2007-12-29" ...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

nkoehring hat geschrieben:Gibt es ein Modul, dass vernuenftige Moeglichkeiten bietet, mit Daten zu rechnen?
Vielleicht datetime.timedelta() ?
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Ah das ist genau was ich brauche! Danke mkallas :D
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

timedelta ist 'ne feine Sache, ja. Hätte ich gern (mitsamt Python) vor vielen Jahren schon gehabt ;)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Leonidas hat geschrieben:Komisch, ich dachte Windows hat so etwas wie ``%HOME%``, so dass man nicht den Pfad selbst zusammensetzen muss.
Evl. %USERPROFILE%?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

birkenfeld hat geschrieben:
Leonidas hat geschrieben:Komisch, ich dachte Windows hat so etwas wie ``%HOME%``, so dass man nicht den Pfad selbst zusammensetzen muss.
Evl. %USERPROFILE%?
Hallo birkenfeld,

ja diese Umgebungsvariable gibt es - jedenfalls in Vista.


Ansonsten hier noch eine Aktualisierte Version des Reminders

Gruß
NKoehring
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Nach vielen Stunden des Programmierens moechte ich nun hier die Freigabe des Reminders v0.2 kund tun!

http://paste.pocoo.org/show/20242/



Edit: Hab ich doch glatt vergessen, den Auto-Refresh einzubauen. :oops:
Wer dieses Feature schon jetzt haben und testen moechte, muss nur die Klasse App ersetzen:

Code: Alles auswählen

class App(wx.App):
    def OnInit(self):
        self.SetAppName("Reminder")
        
        # auto refresh
        self.refresh_timer = wx.Timer()
        self.Bind(wx.EVT_TIMER, self.auto_refresh)
        self.refresh_timer.Start(600000)
        
        # this is needed for quick identification of the current selected note
        # the frame sets it after the mouse entered it
        # then it become a dictionary like
        # {"date": 20080110, "id": 0, "note": "foo and bar...", "daysbefore": 7}
        self.current_note = None
        self.note_frames = list()
        
        # we need IDs for the context menu
        # new note, edit note, delete note, exit program
        self.menu_ids = dict()
        self.menu_ids["new"] = wx.NewId()
        self.menu_ids["edit"] = wx.NewId()
        self.menu_ids["delete"] = wx.NewId()
        self.menu_ids["refresh"] = wx.NewId()
        self.menu_ids["exit"] = wx.NewId()
        self.menu = wx.Menu()
        self.menu.Append(self.menu_ids["new"], "New Note")
        self.menu.Append(self.menu_ids["edit"], "Edit Note")
        self.menu.Append(self.menu_ids["delete"], "Delete Note")
        self.menu.AppendSeparator()
        self.menu.Append(self.menu_ids["refresh"], "Recreate All")
        self.menu.Append(self.menu_ids["exit"], "Exit Program")
        
        self.menu.Bind(wx.EVT_MENU, self.on_click_menu)
        
        return True
        
    def on_click_menu(self, evt):
        id = evt.GetId()
        if id == self.menu_ids["new"]:
            NoteCreateFrame().Show()
            
        elif id == self.menu_ids["edit"]:
            NoteEditFrame(self.current_note).Show()
            
        elif id == self.menu_ids["delete"]:
            ident = self.current_note.ident
            date = int( ident["date"].isoformat().replace("-", "") )
            reminders.delete_note(date, ident["id"])
            self.full_refresh()
            
        elif id == self.menu_ids["refresh"]:
            self.full_refresh()
            
        elif id == self.menu_ids["exit"]: self.ExitMainLoop()
            
    def auto_refresh(self, evt):
        """ triggers a full refresh if the day has changed """
        print "autorefreshing..."
        if hasattr(self, "last_date"):
            if self.last_date != now(): self.full_refresh()
                
        self.last_date = now()
            
    def full_refresh(self):
        """ a full refresh means: close, delete and rebuild all frames """
        for frame in self.note_frames: frame.Close()
        self.note_frames = list()
        self.current_note = None
        reminders.create_frames()
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Hallo nkoehring,

hab´s mal unter XP laufen lassen. Ich kann Deinen Reminder fast gar nicht sehen. Es ist etwa die Hälfte des Datums zu sehen. Habe mal als Test die Taskleisten-Fixierung bei mir aufgehoben. Das hat nicht´s gebracht. Aber es öffnet sich vollständig wenn ich mit der Maus drübersteuer.

Sieht soweit ganz gut aus. Obwohl ich Transparenz lieber mag.

Hab mit der neuen App getestet.

Gruß Andy
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hi Andy,

ja das Problem was du hast fand ich auch erst bei nem Bekannten. Ich hatte naemlich nicht bedacht, dass manche Leute die Taskleiste ja *nicht* automatisch in den Hintergrund rutschen lassen...

Stellst du sie also auf "automatisch im Hintergrund", dann passt das schon. Freilich ist das nicht die optimale Loesung... aber mit ein bissl Gedult und Fantasie kriege ich das schon hin ;)

Danke jedenfalls fuer deine Nachricht.

Gruß
NKoehring
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Und wieder eine Nacht um die Ohren geschlagen. Ich kann irgendwie nicht mehr schlafen -.-
Naja, gut fuer dieses Programm! Ich habe einiges gefixt und hinzugefuegt:

Code: Alles auswählen

# current development version:
# 0.2.5 - development snap
#  * attend to taskbars   (done)
#  * multi-monitoring support   (done)
#  * a configurable delay for the "frame opening"   (done)
#  * fully configurable fonts   (done)
#  * a tray icon (done)
#  * the possibility to show expired notes (done)
#  * there is still a bug with the word wrapping :-/   *** in progress ***
#  * updating the frames seems to ignore "daysbefore"-changes   *** in progress ***
#  * more colors ^^   *** first steps done, still in progress ***

(v0.2.5 - development snap vom 10.01.2008):
http://paste.pocoo.org/show/20403/
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Hab eben schnell über das Programm geschaut... Sieht eigentlich ganz gut aus oO! Also mir hat's scho was beigebracht. Aber ein paar Anmerkungen von meiner Seite, als "Tips" sozusagen.:

1. Hmpf, vielleicht solltest Logik und GUI in 2 unterschiedlichen Dateien packen. Die Configs wären vielleicht in einer .cfg ganz cool, kannst ja dynamisch rauslesen. Würde ein wenig bei der Übersichtlichkeit helfen.

2. Wenn ich eine Note rechtsklicke wird sie verkleinert, fand das Verhalten merkwürdig oO!

3. Du definierst das Kontextmenü im App, normalerweise würde ich sowas im Frame erwarten... Aber vielleicht ist meine Methode überholt oder so, bin mirda nich so sicher.

4. Wenn ich eine neue Note mache, werden alle meine anderen Notes umverschoben ._. Hatte die grade schön sortiert!

5. Ein Kommandozeielnargument, in dem man eine alternative Pickledatei angeben kann wäre cool. Zum Backupen und so...
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

BlackVivi hat geschrieben:Hab eben schnell über das Programm geschaut... Sieht eigentlich ganz gut aus oO! Also mir hat's scho was beigebracht. Aber ein paar Anmerkungen von meiner Seite, als "Tips" sozusagen.:
Danke :D
BlackVivi hat geschrieben:1. Hmpf, vielleicht solltest Logik und GUI in 2 unterschiedlichen Dateien packen. Die Configs wären vielleicht in einer .cfg ganz cool, kannst ja dynamisch rauslesen. Würde ein wenig bei der Übersichtlichkeit helfen.
Ja, das ist fuer die naechste Version geplant. Vorallem das die Config ausgelagert wird.
BlackVivi hat geschrieben:2. Wenn ich eine Note rechtsklicke wird sie verkleinert, fand das Verhalten merkwürdig oO!
Kannst du das mal... ehm... naeher erlaeutern? Denn das klingt auch fuer mich merkwuerdig O_o
BlackVivi hat geschrieben:3. Du definierst das Kontextmenü im App, normalerweise würde ich sowas im Frame erwarten... Aber vielleicht ist meine Methode überholt oder so, bin mirda nich so sicher.
Ja ich wuerde es auch im Frame erwarten. Da ich aber viele Frames habe die alle das exakt gleiche Menue aufrufen, dachte ich mir, ist es so besser.
BlackVivi hat geschrieben:4. Wenn ich eine neue Note mache, werden alle meine anderen Notes umverschoben ._. Hatte die grade schön sortiert!
oops :oops: - naja, das stimmt, Notizen werden bei jeder Aenderung und Aktualisierung neu nach Datum angeordnet. Mal sehen, ob ich das konfigurierbar hinbekommen kann...
BlackVivi hat geschrieben:5. Ein Kommandozeielnargument, in dem man eine alternative Pickledatei angeben kann wäre cool. Zum Backupen und so...
Nett Idee, danke :)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

ein weiterer Snap:

v0.2.5 - development snap vom 11.01.2008:
http://paste.pocoo.org/show/20562/

@BlackVivi: ich habe eingebaut, dass du per Parameter den Pfad zu einer alternativen Datei angeben kannst (sie muss dazu nicht existieren)

Bisher implementiert/geloest:

Code: Alles auswählen

#  * attend to taskbars   (done)
#  * multi-monitoring support   (done)
#  * a configurable delay for the "frame opening"   (done)
#  * fully configurable fonts   (done)
#  * a tray icon (done)
#  * the possibility to show expired notes (done)
#  * optional program argument for alternate db-path (done)
#  * smarter autoarrangement
#      * only the complete stack moveable now (done)
#
#  * more colors ^^   *** first steps done, still in progress ***
#  * updating the frames seems to ignore "daysbefore"-changes ** still in progress **
Noch zu schaffen bis zur 0.3:

Code: Alles auswählen

#  * smarter autoarrangement
#      * arrangement more configurable: "from top/bottom", "last stack position"
#  * a calender widget for date-selection
#  * change the date of existing notes
#  * settings gui
#  * fixed word-wrapping bug
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hallo,

ich wollte mal fragen ob irgendjemand schonmal mein Programm unter einem X-Server (also zB Linux) getestet hat? Ich versuche es naemlich gerade und bekomme dabei jedesmal einen Segmentation Fault ... das ist schon seltsam, find ich :oops:

EDIT: Ja ich weiß nun schonmal woran es liegt. Das wx.Display - Objekt kann nicht erstellt werden. Also muss ich den Multimonitoring-Support wohl deaktivierbar gestalten...

noch ein EDIT: Gut, ich hab jetzt ein Workaround, aber mit der Linuxfunktionalitaet ist es noch ein Stueckchen. Momentan gibts noch Probleme mit dem "oeffnen" also vergroessern der Frames... Ich arbeite dran.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten