Eingabe im Fenster

Fragen zu Tkinter.
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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo bb21

Danke für deine Nachricht auf meine Forum-Mailbox. Da sich die Bedienung der Forum-Mailbox von meinem System aus komisch verhält und ich nicht sicher bin ob meine Antwort auf deine Forum-Mailbox übermittelt wurde sende ich meine Antwort zusätzlich hier. So wie ich dich verstanden habe möchtest du die Entry-Ausgabe noch auf die Konsole umgeleitet haben weil im Tkinter-Fenster sie bei jeder Neu-Ausgabe überschrieben wird. Hier wäre das modifizierte Skript:
http://paste.pocoo.org/show/149754/

Hoffe dir hiermit geholfen zu haben. Bachte die zusätzliche Funktion 'neu_entry_ausgabe'.

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

Hallo wuf!

Das Problem ist leider das meine Version ja zu alt ist und ich das enumarate nicht benutzen kann. Habe mal ne Vorlage gefunden, die bei mir funktioniert, welche aber dann den wert immer überschreibt in der for-scheife und dieses soll eben nicht passieren.

Code: Alles auswählen


from Tkinter import *

var = 'A', 'B', 'C', 'D' 

def fetch(entries):
    for entry in entries:
        print 'Input => "%s"' % entry.get()

def makeform(root, var):
    entries = []
    for field in var:
        row = Frame(root)                  
        lab = Label(row, width=5, text=field)
        ent = Entry(row)
        row.pack(side=TOP, fill=X)           
        lab.pack(side=LEFT)
        ent.pack(side=RIGHT, expand=YES, fill=X)
        entries.append(ent)
    return entries

def show(entries):
    fetch(entries)
    popup.destroy()

def ask():
    global popup
    popup = Toplevel()
    ents = makeform(popup, var)
    Button(popup, text='OK', command=(lambda e=ents: show(e)) ).pack()
    popup.grab_set()
    popup.focus_set()
    popup.wait_window()

root = Tk()
Button(root, text='Eingabe', command=ask).pack()
root.mainloop()
bei mir ist eben das problem in der funktion:

Code: Alles auswählen


def fetch(entries):
    for entry in entries:
        print 'Input => "%s"' % entry.get()

ich weiß einfach nicht wie ich das erweitern kann. habe es auch mal mit den vorschlägen hier probiert aber irgendwie meckert er immer rum.


grüße
Zuletzt geändert von bb21 am Dienstag 10. November 2009, 12:44, insgesamt 2-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Der Code ist nicht in Code-Tags, daher komplett wertlos...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

sorry, habe eben erst rausgefunden wie ich das mache :wink:
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo bb21

Wenn ich dein Skript ausführe zeigt es folgendes Verhalten.

Als erstes gibt es das Fenster mit der Schaltfläche 'Eingabe':
Bild

Beim betätigen der Schaltfäche 'Eingabe' erscheint folgender Eingabe-Dialog mit leeren Eingabefeldern:
Bild

Was meinst du jetzt genau mit überschreiben? Möchtest du das die im Eingabe-Dialog vorhandenen leeren Eingabefelder mit den Daten aus der Liste:

Code: Alles auswählen

var = 'A', 'B', 'C', 'D'
gefüllt werden? Wenn dann der Eingabe-Dialog mit der Schaltfläche 'OK' geschlossen wird die Inhalte der Eingabefelder auf die Konsole ausgegeben werden. Bin leider ein bisschen schwer von Begriff. Vielleicht kannst du dies noch genauer beschreiben.

Könntest du evt. den Python-Code des Skriptes in deinem Post wie Leonidas vorschlägt mit Python-Tags versehen? Damit er ohne abzuändern kopiert und ausgeführt werden kann.

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

habe mich vielleicht auch sehr unverständlich ausgedrückt, das glaube ich mal eher :)


also... nachdem ich "ok" drücke schreibt er mir es ja in die konsole, was auch richtig ist, aber ich will jetzt nicht das er mir z.b. input = a, input =b usw ausgibt.

mein gedanke und ziel ist es das er mir schreibt input 1 =a, input 2 = b, so ne art zähler da mit dran, so das er mir den alten Wert nicht überschreibt.


hoffe das mit dem python-tags ist jetzt richtig?!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Verstehe ich das richtig: Dein Problem ist, dass du beim Iterieren über die Liste einen Zähler mitlaufen lassen willst, aber aufgeschmissen bist, weil deine alte Python-Version kein enumerate kennt?

Falls dem so ist:
1. hat yipyip dazu zwei Lösungen angeboten; hat er leider nicht dick daneben geschrieben ...
2. wenn du das nicht selbst auf die Reihe bekommst, indem du einfach über die Liste iterierst und explizit einen zusätzlichen Zähler mitführst, dann solltest du dir das Tutorial noch einmal ganz gründlich und in Ruhe zu Gemüte führen.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Nach (sehr!) langen Ueberlegungen, was Du wohl mit "Ueberschreiben" meinen koenntest, denke ich, dass Du wohl Probleme hast, die Eingaben aus den Entry-Widgets zu verwalten.
Dafuer gibt es:
http://effbot.org/tkinterbook/variable.htm

Dies sollte Dir weiterhelfen:

Code: Alles auswählen

import Tkinter as tk

class Gui(object):


  def __init__(self, *items):

    self.root = tk.Tk()
    self.form_frame = self.make_form(self.root, items)
    self.form_frame.pack()
    self.ok_but = tk.Button(self.root, text='OK', command=self.show)
    self.ok_but.pack()
    
    self.outtext = tk.StringVar()
    self.outlabel = tk.Label(self.root, textvariable=self.outtext)
    self.outlabel.pack()
    self.show_label()
    

  def make_form(self, parent, items):

    frame = tk.Frame(parent)
    self.labels = [tk.Label(frame, width=5, text=var) for var in items]
    self.svars = [tk.StringVar() for _ in items]
    self.entries = [tk.Entry(frame, textvariable=svar) for svar in self.svars]

    for i, (lab, entry) in zip(xrange(len(items)), zip(self.labels, self.entries)):
      lab.grid(row=i, column=0)
      entry.grid(row=i, column=1)

    return frame
  

  def show(self):

    for i, var in zip(xrange(len(self.svars)), self.svars):
      print "Input %s => %s" % (i, var.get())

    self.show_label()


  def show_label(self):
    
    self.outtext.set("-".join(var.get() for var in self.svars))

    
  def run(self):

    self.root.mainloop()



if __name__ == '__main__':

  Gui("A", "B", "C", "D").run()
:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo bb21

Wenn es dir genügt die Entries nummeriert auf die Konsole auszugeben reicht auch die folgende Anpassung in deinem Code aus:

Code: Alles auswählen

def fetch(entries):
    var_ptr = 0
    for entry in entries:
        print "Input %s => %s" % (var_ptr, entry.get())
        var_ptr += 1
Oder auf deine Variable-Namen bezogen:

Code: Alles auswählen

def fetch(entries):
    var_ptr = 0
    for entry in entries:
        print "Input %s => %s" % (var[var_ptr], entry.get())
        var_ptr += 1
Gruss wuf :wink:
Take it easy Mates!
bb21
User
Beiträge: 12
Registriert: Montag 2. November 2009, 14:41

Dank an alle die mir geholfen haben, es funktioniert jetzt.

Großer Dank noch an wuf!


Grüße...
Antworten