PythonAkten

Fragen zu Tkinter.
Antworten
ichbinjonathan
User
Beiträge: 5
Registriert: Freitag 3. September 2010, 15:41
Wohnort: Brüssel, Belgien

Hallo,

Ich versuche ein Programm für Kontakte zu schreiben, dh. das Programm im Prinzip soll Kontakte aus einer Datei einlesen, die Felder und Werte erkennen und dann für den Benutzer bequem in ein Fenster drucken. Das Programm ansich funktioniert recht gut. Allerdings habe ich einige Probleme mit der Oberfläche.

Ich erkläre kurz die Bedienung:
1. !Wichtig: Vor der Benutzung muss der Dateipfad (=variable dateipfad am Anfang des Programms) auf eine Datei verweisen, die vom Programm gelesen werden kann, d.h. Felder und Werte sind durch ein Komma getrennt, wobei die Werte zwischen Anführungszeichen sind.

Beispieldatei:

Code: Alles auswählen

Vorname,Nachname,Telephon,Strasse Und Nummer,PLZ und Stadt
"Ben","Mueller","02/7810465","Karlsstrasse","Berlin","Hallo","blau"
"Bill","Gates","09876543","Jobstrasse 100", "2333 California Dreaming"
"Jan","Van de Water","1234563","Hof Van Graven","3078 Everberg"
"Peter","Gibler","342342323","Mainstreet","Dublin"
2. Änderungen von Kontaktdaten können durch Doppelklick auf sie vorgenommen werden.
3. Die Suchfunktion durchsucht beim ersten Durchgang alle Daten, beim Zweiten nur in den Suchergebnissen des ersten Durchgangs und so weiter, bis man auf "All Contacts" klickt und damit die Einschränkung der Suche zurücksetzt.
4. Nach Änderungen an der Datei muss man das Programm mit dem Refresh-Button oder manuell neu starten.

EDIT: Programm jetzt im Pastebin:
http://www.python-forum.de/pastebin.php?mode=view&s=238

(das Wichtige ist die class TkApp im unteren Teil)
Falls jemand Zeit und Lust hat mich auf ein paar Dinge aufmerksam zu machen, die man verbessern könnte (die es mit SIcherheit gibt), wäre er mir sehr Willkommen!

Aber zum Hauptproblem:

ich möchte, dass der inhalt von self.felderfeld rechtsbündig ist und der von self.inhaltfeld linksbünig und falls möglich sollte sich das ganze Fenster vergrößern, wenn ich es mit der Maus größer ziehe.

Ich habe schon viel an anderer Stelle gesucht, aber leider nichts gefunden. Ich hoffe, dass mir hier jemand weiterhelfen kann!

Vielen Dank schonmal im Vorraus!
ichbinjonathan
Zuletzt geändert von ichbinjonathan am Freitag 19. August 2011, 20:14, insgesamt 3-mal geändert.
Morgen ist heute schon gestern ;-)
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Kann es sein dass du vorher mit C programmiert hast? Vom Stil her könnts passen (-:
Edit: Ich find das Programm cool (-: gut gemacht (-; bin selber noch eher unerfahren, deswegen kann ich die Qualität des Codes nicht beurteilen (-:
ichbinjonathan
User
Beiträge: 5
Registriert: Freitag 3. September 2010, 15:41
Wohnort: Brüssel, Belgien

Ich bin selber nicht sehr erfahren in Python und wollte dieses Programm als eine Art Übungsprojekt machen. Python ist meine erste Sprache (abgesehen von HTML, aber das ist ja wohl kaum zu vergleichen)! Aber freut mich, dass es dir gefällt!
Morgen ist heute schon gestern ;-)
deets

Ein paar Anmerkungen:

- fuer das lesen von CSV-Dateien gibt es ein Modul (csv)
- Variablenenamen (auch von Buttons) durchzunumerieren ist nicht gut, du solltest die schon nach Funktion benennen
- l[0:len(l)-2] ist Unfug, l[:-2] tut es genauso
- f = ''; f = was_anderes ist sinnlos, spar dir die Belegung mit einem Wert, der dich nicht interessiert
- <zahl> is not <andere zahl> ist sehr, sehr, sehr schlimm falsch. Es funktioniert weil Python diverse Zahlen "eingebaut" hat, so dass Objekt-Identitaet manchmal funktioniert. Aber das ist nicht garantiert! Benutze den Gleichheitsoperator == dafuer!

- diese ganzen "neuer_reiher", "felder_spalter" und Co sind extrem unpythonisch. Dir ist schon klar, das Python maechtige String-Funktionen kennt, wie zB string.split, join, strip und Co?

- listsearch gibt es schon: wert.lower() in liste, oder wenn du der Liste nicht vertrauen kannst, wert.lower() in [v.lower() for v in liste]
- was soll dieser "#-#-#-#..."-Kram?
- durchnumerieren vor Methodennamen ist auch eher ungewoenhlich. zurueck ist zurueck. Was ist zurueck2?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So langen Code bitte auch in ein Paste-bin auslagern; entweder das im Forum integrierte oder paste.pocoo.org z.B..
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ichbinjonathan
User
Beiträge: 5
Registriert: Freitag 3. September 2010, 15:41
Wohnort: Brüssel, Belgien

deets hat geschrieben:Ein paar Anmerkungen:

- fuer das lesen von CSV-Dateien gibt es ein Modul (csv)
- Variablenenamen (auch von Buttons) durchzunumerieren ist nicht gut, du solltest die schon nach Funktion benennen
- l[0:len(l)-2] ist Unfug, l[:-2] tut es genauso
- f = ''; f = was_anderes ist sinnlos, spar dir die Belegung mit einem Wert, der dich nicht interessiert
- <zahl> is not <andere zahl> ist sehr, sehr, sehr schlimm falsch. Es funktioniert weil Python diverse Zahlen "eingebaut" hat, so dass Objekt-Identitaet manchmal funktioniert. Aber das ist nicht garantiert! Benutze den Gleichheitsoperator == dafuer!

- diese ganzen "neuer_reiher", "felder_spalter" und Co sind extrem unpythonisch. Dir ist schon klar, das Python maechtige String-Funktionen kennt, wie zB string.split, join, strip und Co?

- listsearch gibt es schon: wert.lower() in liste, oder wenn du der Liste nicht vertrauen kannst, wert.lower() in [v.lower() for v in liste]
- was soll dieser "#-#-#-#..."-Kram?
- durchnumerieren vor Methodennamen ist auch eher ungewoenhlich. zurueck ist zurueck. Was ist zurueck2?
Erstmal Danke für diese wirklich hilfreiche und ausführliche Antwort! Ich werde diese Version im Laufe der nächsten Zeit überarbeiten und dann die neuere Version hier hinein stellen. Zu deinen Anmerkungen:
- Ich habe nicht von dem CSV Modul vorher gewusst, sonst hätte ich mir damit warscheinlich einen Großteil des Schreibens sparen können^^ aber ich werde mich für die neuere Version damit auseinander setzten, vielen vielen Dank!

- bei <zahl> is not <andere zahl> denke ich redest du von:
Z.21

Code: Alles auswählen

if (z_nummer+1 is not i):
; Z.50

Code: Alles auswählen

while (a is not len(felder)):
; Z.56

Code: Alles auswählen

while (i is not len(zeilen)):
; Z.60

Code: Alles auswählen

while (a is not len(werte)):
und Z.116

Code: Alles auswählen

while (a is not i):
Jetzt heißt in diesen Fällen 'is not' ja auch is not und nicht '=='... meinst du, ich sollte 'is not' duch '<>' oder etwas in der Art ersetzen?
- srting.split, bzw. sring.rsplit habe ich mittlerweile kennengelernt, kannte ich allerdings nicht, als ich die Funktion felderspalter und Co geschrieben habe, in der neuen Version werde ich das auf jeden Fall ändern müssen!

- der "#-#-#-#..."-Kram diente nur mir persönlich, weil ich fand, dass der Code dadurch übersichtlicher wird... sonst hat er keine Bedeutung
- zureuck2 ist die Funktion die beim binding verwendet wird. Da man für binding ja das Argument 'event' in die Klammern der Funktion schreiben muss, die man aufrufen will, wusste ich nicht, wie man die Funktion die über den Button- und die über die Tastatur für beide schreibt, also habe ich eine für das binding und eine für den Button geschrieben... zurueck2 ist die Funktion die mit den Pfeiltasten aufgerufen wird, zuruck die für den Button.

Nochmals vielen DAnk für diese wertvollen Hinweise!
Morgen ist heute schon gestern ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ja, es ging um die von dir genannten `is not`. Die machen nämlich nicht, was du glaubst. `is not` prüft auf die Identität von Objekten, also ob es sich um das selbe Objekt handelt oder nicht:

Code: Alles auswählen

>>> a = "das ist ein langer string"                                                     
>>> b = "das ist ein langer string"                                                     
>>> a is b                                                                              
False                                                                                   
>>> a == b                                                                              
True
Das selbe passiert auch bei Zahlen, hier fällt dies nur nicht auf, da bei kleinen Werten der Interpreter ein wenig optimiert. Ungleich ist in Python übrigens `!=` und nicht `<>`

Denn `####`-Kram solltest du dir wirklich abgewöhnen. Überlege dir besser, wie du deinen Code sinnvoll strukturieren und anordnen kannst. Irgendwann weisst du, wo sich was befindet und siehst es auch sofort beim Rüberscrollen an der Form des Texts. Im Normalfall hilft hier auch eine gute IDE weiter.

Bei `zurueck2` ging es nicht darum, was es macht, sondern um den Namen. `zurueck2` sag nämlich nichts darüber aus, was im Code passiert. Nenne es meinetwegen `zurueck_mit_pfeiltasten` oder noch sinnvoller (das "pfeiltasten" ist in meinem Vorschlag das Problem). Man sollte am Namen bereits den Unterschied zwischen `zurueck` und `zurueck2` erkennen.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@ichbinjonathan: Bei diesen `weiter()`/`weiter2()`, `zurück()`/`zurück2()`, usw. hast Du ja den Quelltext im Grunde nur kopiert. So etwas sollte man unbedingt vermeiden weil das fehleranfällig ist. Du könntest ja auch `weiter2()` einfach nur `weiter()` aufrufen. Da steht der Code ja schon drin. Aber am besten gibst Du dem `event` in der Funktionssignatur einfach einen Default-Wert, dann kann man die Methode sowohl mit als auch ohne Argument aufrufen. Verwendet wird es ja sowieso nicht.

Edit: Die letzten beiden Zeilen in diesen Methoden ist auch immer gleich → sollte man in eine eigene Methode raus ziehen.
Antworten