Eingabe im Fenster

Fragen zu Tkinter.
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

Hallo!
Ich bin neu hier und hätte mal eine Frage an euch. Ich programmiere noch nicht lange mit pyhton (ca 3monate) und habe immer Fesnter aufgerufen die eben nur per ja oder nein beantwortet werden müssen. Die antwort habe ich dann eingelesen in eine Excel Tabelle. Jetzt zu meinem Problem, wo ich das ganze We dran saß, wie bekomme ich es hin, das sich ein Fenster öffnet, ich was eingebe und dieses dann auslese. Ich muss genau 4 Eingaben machen, sind einfache Zahlenwerte.

mit dem yes/no Abfrage habe ich das immer so gemacht, kann man das ähnlich aufbauen?

Code: Alles auswählen

    print "pause"      #yesno window open
    Tkinter.Tk().withdraw()
    result = tkMessageBox.askyesno('´Test','Bestaetigung möglich ? ')
    Value="Test"
    Target= "Successful"
    if result == 1:
        print "Ja"     #yesno window close
        TestCaseState = "PASS"
        Actual= "Successful"
    else:
        print "Nein"     #yesno window close
        TestCaseState = "FAIL"
        Actual= "Failed"
    testcondition(Value, Target, Actual, TestCaseState)


Danke schonmal im Voraus, falls ihr Tips für mich habt oder ähnliches
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

bb21 hat geschrieben:Danke schonmal im Voraus, falls ihr Tips für mich habt oder ähnliches
Willkommen im Forum!
Hast du schon mal das Tutorial durchgearbeitet?
Ansonsten der erste Tipp: Python-Code muss in Code-Tags (Python-Button) gesetzt werden, sonst ist er unlesbar. :)
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

hey!

ja habe mit Hilfe des Tutorials schon die ganze Zeit gearbeitet und immer wenn ich ne Frage hatte mal reingeguckt, aber von vorne bis hinten ganz durchgearbeitet.. nein.


habe jetzt schon was gefunden im netz, so ähnlich soll es dann aussehen:

http://www.java2s.com/Code/Python/GUI-T ... fields.htm


aber wenn ich das probiere, öffnet sich das "tk-Fenster" und mein Programm stürzt dann ab, was ich eben mit der anderen Eingabe nicht hatte.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Die langfristig sinnvollste Lösung sieht so aus, dass du dir zunächst einmal Zeit nimmst, dich in die Grundlagen von Tkinter einzuarbeiten. Das ist vielleicht ein wenig mühsam und beschert dir nicht nach 5 min die Lösung für dein aktuelles Problem, aber es ist tragfähiger:

1. http://www.ferg.org/thinking_in_tkinter ... grams.html
2. http://infohost.nmt.edu/tcc/help/pubs/tkinter/
3. http://effbot.org/tkinterbook/tkinter-index.htm
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

ja danke für die links, werde dann mal reingucken.

ich werde mich nochmal etwas umgucken im netz nach einer lösung, wie ich das am besten mit der eingabe hinbekommen, klappt leider noch nicht ganz so wie ich will :(
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

bb21 hat geschrieben:ich werde mich nochmal etwas umgucken im netz nach einer lösung, wie ich das am besten mit der eingabe hinbekommen, klappt leider noch nicht ganz so wie ich will :(
Da brauchst du dich nicht im "Netz umgucken". Lies dich doch einfach mal in Tkinter ein. Dann findest du sehr bald das Entry-Widget und dann ist das ganze schnell gemacht.
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

Hi hallo,
danke nochmal für die Links, habe mich gestern mal den ganzen abend rangesetzt und bin da schon ne Ecke weiter.

Jetzt habe ich aber ein anderes Problem, was ich mir vielleicht persönlich zu schwer gemacht habe. Ich habe jetzt ein Fenster erstellt mit 3 Eingabemöglichkeiten und da ist mein Problem.

Ich lese mit einer for-Schleife meine Werte ein, die er mir in das Fenster schreiben soll, mein Problem ist jetzt aber das ich so die Werte nicht einzelnt auslesen kann, sondern nur als Ganzes. Habe auch schon in verschieden Tutorials geguckt, aber so richtig bin ich da nicht schlau drauß geworden.

Habe mal ein bsp mit beigefügt um das zu verdeutlichen.

Gehört zwar nicht hier rein von der Fragestellung aber ich wollte nicht unnötig einen neues Thema aufmachen.

--------------------------------------------------------------------------------

a = ['A', 'B', 'C']

for x in a:
print 'Variable => "%s"' % x


## Ergebnis

Variable => "A"
Variable => "B"
Variable => "C"


## Gewünschtes Ergebnis z.B.

Variable1 => "A"
Variable2 => "B"
Variable3 => "C"

--------------------------------------------------------------------------------
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

ich denke du willst enumerate

Mach aber für jede Frage, die ein neues Thema ist auch ein neues Thema auf.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo
(ver)suchst du sowas

Code: Alles auswählen

a = ["A","B","C"]
for i,x in enumerate(a):
    print 'Variable%s => "%s"'%(i+1,x)

##Ergebnis
Variable1 => "A"
Variable2 => "B"
Variable3 => "C"
Gruß...busfahrer
Alles wird gut ;-)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

alternativ mit izip und count(1)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

Hey danke euch schonmal,
so was in der art habe ich gesucht.

leider funktioniert das bsp bei mir nicht so richtig, aber ich werde mich da nochmal ransetzen und gucken was bei mir der Fehler ist.


Danke für die Hilfe!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo bb21

Beim Beispiel von 'busfahrer' musst du darauf achten, dass die Zeilen nach dem Kommentar 'Ergebnis' kein Python-Code ist! Also nur folgender Code ausführen:

Code: Alles auswählen

a = ["A","B","C"]
for i,x in enumerate(a):
    print 'Variable%s => "%s"'%(i+1,x)
Das folgende Ergebnis wird dann auf deiner Konsole ausgegeben:

Code: Alles auswählen

Variable1 => "A"
Variable2 => "B"
Variable3 => "C" 
So wird 'busfahrers' Beispiel auch bei dir funktionieren

Gruss wuf :wink:
Take it easy Mates!
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

Hi wuf,
ja danke, das hatte ich schon verstanden, da ich es ja oben ähnlich geschrieben hatte. :wink:

aber dennoch komisch das es bei euch hinhaut und bei mir nicht.
muss ich vor die funktionn och was schreiben, oder kann ich die einfach so übernehmen?


Grüße und danke weiterhin
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo bb21

Hier ein Experimentier-Skript für das Übertragen von Eingabedaten an eine Ausgabe basierend auf dem von 'busfahrer' vorgeschlagene 'enumerate'. (Lasse dich nicht durch die Farben ablenken!.Diese veranschaulichen nur die Verteilung der verschiedenen 'Frames'-Behälter):

Code: Alles auswählen

# wuf_ref: entry_on_mainwindow_01_01.py

import Tkinter as tk

def end_app():
    """Beende die Anwendung"""
    app_win.destroy()

def entry_output():
    """Uebertrage Daten von der Eingabe in die Ausgabe"""
    for index, entry_obj in enumerate(entry_obj_list):
        entry_data = entry_obj.get()
        output_obj_list[index].config(text=entry_data)

#~~ Erstelle das Hauptfenster
app_win = tk.Tk()
#~~ Abmessungen fuer das Hauptfenster
app_win.geometry('200x150')

#~~ Erstelle alle Behaelter-Objekte
in_out_frame = tk.Frame(app_win)
in_out_frame.pack(side='top', fill='both', expand='yes')

entry_frame = tk.Frame(in_out_frame, bg='yellow')
entry_frame.pack(side='left', fill='both', expand='yes')

output_frame = tk.Frame(in_out_frame, bg='green')
output_frame.pack(side='left', fill='both', expand='yes')

button_frame = tk.Frame(app_win, bg='steelblue')
button_frame.pack(side='top', fill='both', expand='yes')

#~~ Erstelle alle Bedienungsschaltflaechen-Objekte
#   Schaltflaeche: Beenden
button_end = tk.Button(button_frame, text="Beenden", highlightthickness=0,
    command=end_app)
button_end.pack(side='left', expand='yes')

#   Schaltflaeche: Ausgeben
button_output = tk.Button(button_frame, text="Ausgabe", highlightthickness=0,
    command=entry_output)
button_output.pack(side='left', expand='yes')

#~~ Variable-Liste
a = ["A", "B", "C", "D"]

#~~ Sammellisten fuer die Eingabe- und Ausgabe Widget-Objekte
entry_obj_list = list()
output_obj_list = list()

for index, variable in enumerate(a):
    #~~ Erstelle Eingabe-Objekt
    entry = tk.Entry(entry_frame, bg='white', width=10, highlightthickness=0)
    entry.pack(side='top', expand='yes', pady=2)

    #~~ Uebertrage Variable aus der Varible-Liste ins Eingabefeld
    entry.insert(0, variable)

    #~~ Erstelle Ausgabe-Objekt
    output_label = tk.Label(output_frame, bg='white', width=10, anchor='w')
    output_label.pack(side='top', expand='yes', pady=2)

    #~~ Speichere Eingabe- und Ausgabe-Objekt in der zugehoerigen Objekt-
    #   Sammelliste
    entry_obj_list.append(entry)
    output_obj_list.append(output_label)

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bb21 hat geschrieben:aber dennoch komisch das es bei euch hinhaut und bei mir nicht.
Welche Fehlermeldung erhältst du?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

bb21 hat geschrieben:aber dennoch komisch das es bei euch hinhaut und bei mir nicht.
Kannst du evt. hier dein Code zeigen?
Welches Betriebsystem und Python-Version verwendest du? Startest du dein Skript aus 'Idle' oder 'Konsole'?

Ich starte es aus der 'Konsole' und verwende Linux-SuSE11.0 mit Python2.5

Gruss wuf :wink:
Take it easy Mates!
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

Ich habe die Version 2.2.1 und XP. Er meckert immer "enumerate is not defined"...

fehlen mir vielleicht funktionen, bibliotheken die es erst in den versionen später gab?!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Laut Doku gibt es 'enumerate' erst ab Python 2.3 .
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

ah ok, da liegt das problem... schade :(
gibt es dann noch ne andere möglichkeit außer enumerate?!

vielleicht was jbs meinte mit count(1) oder ähnliches?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Code: Alles auswählen

In [16]: import itertools as it

In [17]: vars = ('a', 'b', 'c')

In [18]: for i, x in zip(it.count(1), vars): print '%s%s' % (x, i)  
a1
b2
c3
Etwas weniger schoen:

Code: Alles auswählen

In [19]: for i, x in zip(xrange(1, len(vars)+1), vars): print '%s%s' % (x, i)
   ....: 
a1
b2
c3
:wink:
yipyip
Antworten