Seite 1 von 1

simple reminder

Verfasst: Dienstag 8. Januar 2008, 04:10
von nkoehring
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 ;)

Verfasst: Dienstag 8. Januar 2008, 09:49
von Leonidas
Komisch, ich dachte Windows hat so etwas wie ``%HOME%``, so dass man nicht den Pfad selbst zusammensetzen muss.

Verfasst: Dienstag 8. Januar 2008, 10:02
von nkoehring
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 :(

Verfasst: Dienstag 8. Januar 2008, 10:50
von mkesper

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.

Verfasst: Dienstag 8. Januar 2008, 10:58
von Leonidas
nkoehring hat geschrieben:Also wenn, dann steht es nicht in os.environ :(
Du kannst ``os.path.expanduser('~/pfad')`` verwenden.

Verfasst: Dienstag 8. Januar 2008, 11:35
von nkoehring
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

Verfasst: Dienstag 8. Januar 2008, 14:25
von nkoehring
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" ...

Verfasst: Dienstag 8. Januar 2008, 14:50
von mkesper
nkoehring hat geschrieben:Gibt es ein Modul, dass vernuenftige Moeglichkeiten bietet, mit Daten zu rechnen?
Vielleicht datetime.timedelta() ?

Verfasst: Dienstag 8. Januar 2008, 15:22
von nkoehring
Ah das ist genau was ich brauche! Danke mkallas :D

Verfasst: Dienstag 8. Januar 2008, 15:32
von Y0Gi
timedelta ist 'ne feine Sache, ja. Hätte ich gern (mitsamt Python) vor vielen Jahren schon gehabt ;)

Verfasst: Dienstag 8. Januar 2008, 17:43
von birkenfeld
Leonidas hat geschrieben:Komisch, ich dachte Windows hat so etwas wie ``%HOME%``, so dass man nicht den Pfad selbst zusammensetzen muss.
Evl. %USERPROFILE%?

Verfasst: Dienstag 8. Januar 2008, 21:50
von nkoehring
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

TADA!

Verfasst: Mittwoch 9. Januar 2008, 06:41
von nkoehring
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()

Verfasst: Mittwoch 9. Januar 2008, 20:05
von Andy
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

Verfasst: Mittwoch 9. Januar 2008, 21:35
von nkoehring
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

Verfasst: Donnerstag 10. Januar 2008, 06:51
von nkoehring
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/

Verfasst: Donnerstag 10. Januar 2008, 07:13
von BlackVivi
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...

Verfasst: Donnerstag 10. Januar 2008, 11:14
von nkoehring
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 :)

Verfasst: Freitag 11. Januar 2008, 01:37
von nkoehring
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

Verfasst: Sonntag 13. Januar 2008, 22:54
von nkoehring
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.