simple reminder

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

simple reminder

Beitragvon nkoehring » Dienstag 8. Januar 2008, 04:10

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 8. Januar 2008, 09:49

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 Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Dienstag 8. Januar 2008, 10:02

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 :(
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Beitragvon mkesper » Dienstag 8. Januar 2008, 10:50

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 8. Januar 2008, 10:58

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 Modvoice
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Dienstag 8. Januar 2008, 11:35

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
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Dienstag 8. Januar 2008, 14:25

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" ...
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Beitragvon mkesper » Dienstag 8. Januar 2008, 14:50

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:

Beitragvon nkoehring » Dienstag 8. Januar 2008, 15:22

Ah das ist genau was ich brauche! Danke mkallas :D
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 8. Januar 2008, 15:32

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

Beitragvon birkenfeld » Dienstag 8. Januar 2008, 17:43

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:

Beitragvon nkoehring » Dienstag 8. Januar 2008, 21:50

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
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

TADA!

Beitragvon nkoehring » Mittwoch 9. Januar 2008, 06:41

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()
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Beitragvon Andy » Mittwoch 9. Januar 2008, 20:05

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:

Beitragvon nkoehring » Mittwoch 9. Januar 2008, 21:35

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder