Mein neustes Projekt ein Dateimanager à la Norton Commander. Aktuell ist Version 1.6.
Ich habe das Programm entwickelt weil mich einige Sachen im Windows Explorer stören und um mich in wxPython besser einzuarbeiten.
Mann kann beispielsweise im Gegensatz zum Windows Explorer auch Dateinamen erstellen, die mit einem Punkt anfangen (.htaccess).
Ab Version 1.5 kann UliCommander *.zip, *.tar.gz und *.tar.bz2 Dateien entpacken.
Man kann Befehle über die Kommandozeile aufrufen, Funktionstasten nutzen und Dateien in einem Texteditor öffnen.
Unter Windows ist notepad, unter Linux gedit voreingestellt als Editor. chmod wird unterstützt, man kann Dateien drucken (lpr).
Die ältere Linux Version (1.3) ist als Python-Code verfügbar. Für Windows gibt auch eine mit py2exe kompilierte Version mit Installer.
Ich plane bald die aktuelle Version als Linux-Source zu veröffentlichen, allerdings muss ich dafür die Windows-only Funktionen entfernen.
Mehr Informationen zu dem Projekt, Screenshots und Downloads gibt es unter folgender URL:
http://www.deruli.de/seite/ulicommander_dateimanager
UliCommander - Ein Dateimanager
-
- User
- Beiträge: 42
- Registriert: Montag 8. November 2010, 15:25
- Wohnort: Braunschweig
- Kontaktdaten:
Ich habe mir mal mangels Sourcecode fuer die neueste Version die 1.3 runtergeladen.
Da gibt's so manches zu bemerken:
- caseinsensitive_sort <=> sorted(my_list, key=lambda x: x.lower())
- statt "for drive in ['A', 'B',...]" kann man gleich ueber einen String iterieren: "for drive in 'ABC...'"
- du vermischst Logik mit GUI. Deine ganzen Operationen koennten in einem kleinen, System-abhaengigen Kernmodul liegen, und die UI benutzt das nur. Macht das Leben viel leichter zum tests schreiben, aber auch fuer den OS-Support usw.
- benutze os.path.join
- try/except ohne Spezialisierung - nicht gut. Machst du dir selbst nur das Leben schwer mit.
- gigantische if-elif-Kaskaden um einen numerischen Wert auf einen String abzubilden (onSortChange) - dazu sind Dictionaries erfunden worden
- global Variablen sind nicht gut, was passiert, wenn du mal mehrere Fenster mit unterschiedlich sortierten Views haben willst - dann ist "orderby" ein Problem als globale Variable.
- runString2 ist zum ersten schlecht benannt, zweitens reicht es, nur subprocess zu benutzen (auf allen Plattformen), und last but not least ist ein fallback auf os.startfile nicht so gut denke ich - wer weiss, was da alles schief gehen kann. Und multi-threading ist fuer gestartete Unterprozesse ebenfalls nicht angezeigt.
- wenn du schon threading willst, dann benutze das Modul threading, nicht thread.
- benutze try/finally fuer die os.chdir-Geschichten.
Das soll erstmal reichen.
Da gibt's so manches zu bemerken:
- caseinsensitive_sort <=> sorted(my_list, key=lambda x: x.lower())
- statt "for drive in ['A', 'B',...]" kann man gleich ueber einen String iterieren: "for drive in 'ABC...'"
- du vermischst Logik mit GUI. Deine ganzen Operationen koennten in einem kleinen, System-abhaengigen Kernmodul liegen, und die UI benutzt das nur. Macht das Leben viel leichter zum tests schreiben, aber auch fuer den OS-Support usw.
- benutze os.path.join
- try/except ohne Spezialisierung - nicht gut. Machst du dir selbst nur das Leben schwer mit.
- gigantische if-elif-Kaskaden um einen numerischen Wert auf einen String abzubilden (onSortChange) - dazu sind Dictionaries erfunden worden
- global Variablen sind nicht gut, was passiert, wenn du mal mehrere Fenster mit unterschiedlich sortierten Views haben willst - dann ist "orderby" ein Problem als globale Variable.
- runString2 ist zum ersten schlecht benannt, zweitens reicht es, nur subprocess zu benutzen (auf allen Plattformen), und last but not least ist ein fallback auf os.startfile nicht so gut denke ich - wer weiss, was da alles schief gehen kann. Und multi-threading ist fuer gestartete Unterprozesse ebenfalls nicht angezeigt.
- wenn du schon threading willst, dann benutze das Modul threading, nicht thread.
- benutze try/finally fuer die os.chdir-Geschichten.
Das soll erstmal reichen.
-
- User
- Beiträge: 42
- Registriert: Montag 8. November 2010, 15:25
- Wohnort: Braunschweig
- Kontaktdaten:
Das ist ein Beispielcode aus einem Forum.deets hat geschrieben:Ich habe mir mal mangels Sourcecode fuer die neueste Version die 1.3 runtergeladen.
Da gibt's so manches zu bemerken:
- caseinsensitive_sort <=> sorted(my_list, key=lambda x: x.lower())
Weil ich nicht wusste, wie ich eine Case Insensitive Sortierung durchführen sollte.
In der aktuellen Version habe ich die Iteration durch einen Windows-API Aufruf ersetzt.deets hat geschrieben: - statt "for drive in ['A', 'B',...]" kann man gleich ueber einen String iterieren: "for drive in 'ABC...'"
OK, da hast du Recht.deets hat geschrieben: - du vermischst Logik mit GUI. Deine ganzen Operationen koennten in einem kleinen, System-abhaengigen Kernmodul liegen, und die UI benutzt das nur. Macht das Leben viel leichter zum tests schreiben, aber auch fuer den OS-Support usw.
Wo ist da der Unterschied zu os.path.abspath()?deets hat geschrieben: - benutze os.path.join
Dictionaries sind mir bekannt.deets hat geschrieben: - gigantische if-elif-Kaskaden um einen numerischen Wert auf einen String abzubilden (onSortChange) - dazu sind Dictionaries erfunden worden
Aber wie meinst du das jetzt in Beziehung zu den Größeneinheiten?
Was gibt es für Methoden um die Dateigrößen je nach Größe in Byte, KB MB oder GB anzugeben?
deets hat geschrieben: - runString2 ist zum ersten schlecht benannt, zweitens reicht es, nur subprocess zu benutzen (auf allen Plattformen), und last but not least ist ein fallback auf os.startfile nicht so gut denke ich - wer weiss, was da alles schief gehen kann. Und multi-threading ist fuer gestartete Unterprozesse ebenfalls nicht angezeigt.
os.startfile() öffnet eine Datei unter Windows mit der Standardanwendungen.
Was gibt es denn für Alternativen dazu?
die ganzen Popen Funktionen dienen ja nur dazu um externe Prozesse zu starten (*.exe).
Ohne Threading hängt das ganze Programm, bis der Subprocess beendet ist.deets hat geschrieben: - wenn du schon threading willst, dann benutze das Modul threading, nicht thread.
- benutze try/finally fuer die os.chdir-Geschichten.
Das soll erstmal reichen.[/quote]
Das ist kein Unterschied, das ist was anderes. Du schreibst sowas hier:Wo ist da der Unterschied zu os.path.abspath()?
Code: Alles auswählen
os.path.abspath(cwdp+"/"+unicode(self.ListCtrl_Dateien.GetItemText(index)))
Code: Alles auswählen
os.path.abspath(os.path.join(cwdp, unicode(self.ListCtrl_Dateien.GetItemText(index))))
Nein, ich meine sowasDictionaries sind mir bekannt.
Aber wie meinst du das jetzt in Beziehung zu den Größeneinheiten?
Was gibt es für Methoden um die Dateigrößen je nach Größe in Byte, KB MB oder GB anzugeben?
Code: Alles auswählen
if evt.GetId()==119:
sortby="aufsteigend"
elif evt.GetId()==120:
sortby="absteigend"
elif evt.GetId()==115:
orderby="name"
elif evt.GetId()==116:
orderby="datum"
elif evt.GetId()==117:
orderby="groesse"
elif evt.GetId()==118:
orderby="typ"
Code: Alles auswählen
{ 116 : "datum", 117 : "groesse", ...}[evt.getId()]
Das Problem ist nicht die Alternative, sondern dein fallback - erstmal als subprocess ausfuehren, *dann* mit startfile. Ich wuerde entweder das eine oder das andere machen, wahrscheinlich abhaengig von der File-Endung.os.startfile() öffnet eine Datei unter Windows mit der Standardanwendungen.
Was gibt es denn für Alternativen dazu?
die ganzen Popen Funktionen dienen ja nur dazu um externe Prozesse zu starten (*.exe).
Weil du es nicht richtig benutzt. Verwende suprocess.Popen, und dann zB Timer in wx, um den Status abzufragen.Ohne Threading hängt das ganze Programm, bis der Subprocess beendet ist.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Warum die Windows-only Funktionen entfernen? Also ich meine, schmeißt den Code einfach auf github.com und arbeite weiter dran. Ist es nicht so, das es im Grunde nie fertig ist. Mann kann immer weiter arbeiten, Dinge schöner erledigen usw. Fertig wird Software doch nie, oder?ulrich1992 hat geschrieben:Ich plane bald die aktuelle Version als Linux-Source zu veröffentlichen, allerdings muss ich dafür die Windows-only Funktionen entfernen.
