Liste aus Entry oder File-und dann?

Fragen zu Tkinter.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 20. August 2007, 12:53

Hallo!

Ich habe folgendes Problem:

ich möchte mit einer Liste Berechnungen machen. Diese kann man in ein Entry Feld eingeben (1) oder als txt File laden (> 1). Nur dann weiss ich nicht weiter. Wie kann ich nach dem Laden mit meinen Methoden weiterfahren? Bei dem Entry Feld hab ich ja meine Methode und diese enthählt die Liste aus entry.get() . Soll ich in die Methode "Laden" meine Methode "Berechnung" mit einbauen? Nur dann hab ich sie ja doppelt (einmal für Entry und einmal für Laden) und das ist ja unschön...Oder einen Button in "Laden" mit einfügen die dann das Kommando zur Methode "Berechnen" ausführt?

Ich hoffe es ist verständlich...Falls nicht kann ich auch meinen Code angeben. Vielleicht gibt es einen standard Weg!?

lg Stefanie
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Montag 20. August 2007, 13:45

Hi Stefanie!
ete hat geschrieben: Ich hoffe es ist verständlich...Falls nicht kann ich auch meinen Code angeben. Vielleicht gibt es einen standard Weg!?
Also ein Stück Code würde echt helfen. Was ist denn genau dein Problem? Aus dem String, den du aus dem Entry oder der Textdatei lädst, eine Liste machen? Oder was?
könntest das doch inetwa so machen:

Du hast eine Auswal, in der man entweder eine Liste über ein Entry eingeben kann, oder statt der Liste ein Fileobj. auswählt (tkFileDialog).
Du nimmst den Dateinamen von "askopenfilename" und setzt ihn in das Entry.Nach einem Klick auf den Bestätigungsbutton, rufst du eine Methode auf, die dann nach ner Fallunterscheidung (entweder vorher ne Variable setzen oder mit os.path.isfile testen) aus dem Filename (wenns einer ist) einen String macht, und ihn mit diesem überschreibt. Im "allgemeinen" Teil, nach dem if-Block, verarbeitest du dann den String, der in der übergebenen (und evtl. bereits überschriebenen) Variable gespeichert ist, zu einer Liste (mit split(", ") oder so).

LG
lunar

Montag 20. August 2007, 13:56

Du schreibst eine eigene Methode/Funktion zum Ausführen der Berechnungen, welche die Liste als Parameter erhält.

Dann kannst du diese entweder mit einer aus einer Datei geladenen Liste oder mit der in der GUI eingegebenen Liste aufrufen.

Für mehr Hilfe müsste man schon den Code sehen...
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 20. August 2007, 14:02

ok hier mal der Code, ich hab den problematischen Part auskommentiert...

Edit (Leonidas): Code ausgelagert.

Wie kann ich dem Programm jetzt sagen, ob die Liste aus dem Entry Feld oder aus dem File kommt?

MFG
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Montag 20. August 2007, 15:05

Hallo Stefanie

ich würde die Liste laden und in das Entry-Feld stellen.

Code: Alles auswählen

entry.insert(END, text)
Dann sieht der User, was geladen wurde und für das Programm muss Du keine Unterscheidung machen. Ggf. musst Du natürlich das Entry vorher leeren.

Mawilo
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 20. August 2007, 16:33

Aber das File kann hunderte von Einträgen haben-geht das dann?

Eingabe sieht etwa so aus:

GCA TGC TGG CGG TGC TGG AG
CCG AGC ACG ATG GCT GCA GGT
CAG CCA TCG TGC TCG GTC CTG A
GCA GCA GGT AGC TGG TGG GGA GT

Die Berechnung erfolgt ja für jeden Primer (Sequenz). Es werden am Ende also 4 Tm Werte ausgegen (wenn man beim Bsp. bleibt)
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Montag 20. August 2007, 18:23

Mawilo hat geschrieben:ich würde die Liste laden und in das Entry-Feld stellen.
Das halte ich für eine schlechte Lösung. Denn wenn man eine Datei läd, dann deshalb, weil man weiß was drinsteht und weil das viel ist. In so ein Entry passt ja kaum was rein, vor allem nix mehrzeiliges. Wenn es wünschenswert wäre, müsste man schon ein Textfeld nehmen.

Ich hatte oben an sowas gedacht:
http://paste.pocoo.org/show/2691/
Aufgrund eines unvollkommenen Programmverständnisses erst fast lauffähig. :wink:
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Montag 20. August 2007, 21:50

Ich dachte auch, dass es nur wenige Einträge sind. Die vielen Einträge können aber gut in einem Textfenster (ScrolledText) dargestellt werden.

Ich habe hier mal ein Beispiel erstellt.
Aufgefallen ist mir, dass Du in den Zeilen 44 bis 47 Variablen den Bezeichnungen self.entry1 bis self.entry4 zuweist und wenig später in den Zeilen 63 bis 66 die Variablen schon wieder mit den Entrys überschreibst. Da bekommst Du garantiert ein Problem bei der Berechnung. Ich kennzeichne Variablen immer besonders (z.B. self.var_entry1), wobei sich bei mir das Durchnummerieren von Elementen nicht bewährt hat. Sobald Du später noch ein Element einfügen möchtest, wird es schwierig.

Mawilo
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Dienstag 21. August 2007, 08:05

Ah, danke für die Bsp.! Ich wusste nicht das es über ein Textfeld funktioniert...

Ja, Mawilo du hast recht, ist mir auch schon beim Schreiben aufgefallen...Darum wollte ich mich später kümmern, erstmal soll es laufen :D

Also vielen Dank :)

Stefanie
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Sonntag 2. September 2007, 13:31

Hab jetzt aber folgendes Problem:

Die Berchechnungen werden jetzt pro gesamt Inhalt des Textfeldes berechnet, also nicht pro Zeile.

Bsp. wie es funktionieren soll:

Eingabe

atgctctgatgctcgat
gtcgctgatcgatgct
taggctgattctcgatgcgctga

Ausgabe

Wert1
Wert2
Wert3

Momentan bekomm ich einen Wert für alle 3 Zeilen.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Sonntag 2. September 2007, 14:46

Wenn die Werte immer nur über eine Zeile gehen, kannst Du den Inhalt des Textfeldes am Zeilenumbruch aufteilen und mit den einzelnen Zeilen weiterarbeiten.

Beispiel:

Code: Alles auswählen

def berechnen(self):
    x = self.textfeld.get(0.0, END)
    lines = x.split('\n')
    for line in lines:
        print 'mach was mit: %s'%line
Mawilo
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 3. September 2007, 15:28

Hallo!

Danke für den Tip!

Lieder wird am Ende des Textfeldes eine leere Zeichenkette zugefügt?!
Wie kann ich das vermeiden? Diese wird nämlich mitbrechnet und ich bekomme einen (falschen) Wert dafür!

Bei Bedarf kann ich nochmal den aktuellen Code posten...

Liebe Grüsse

Stefanie
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Montag 3. September 2007, 15:31

Hallo,

ja, poste mal dein Code :D

Gruss
pyStyler
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Montag 3. September 2007, 15:36

Das letzte Element der Liste ist in diesem Fall leer.

Hier mal ein aufgehübschtes Beispiel:

Code: Alles auswählen

def berechnen(self):
    x = self.textfeld.get(0.0, END)
    lines = x.split('\n')
    for line in lines:
        if line != '':
            print 'mach was mit: %s'%line
Mawilo
Antworten