Mehrere entry-widgets gleichzeitig konfigurieren

Fragen zu Tkinter.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

a) Muss es root heißen? Nein, es bietet sich nur an.
b) Unterstrich: Hier nicht. Man spart sich lediglich einen Namen auszudenken, da ein solcher hier nicht gebracht wird.
c) Zum Rest: Probiere die Sachen doch mal im interaktiven Iterpreter aus und lese ein wenig in der Dokumentation. Das sind alles keine Dinge, die man nicht innerhalb von 30 Minuten selber rausfinden kann.

Sebastian
Das Leben ist wie ein Tennisball.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Zum 1. Ich denke das hat keinen tieferen Sinn ;)

2. Es muss nicht root heißen
3. Unterstriche verwendet man, wenn man die Variable (Bezeichner) nicht braucht
4. Ich hoffe der Code hilft

Code: Alles auswählen

>>> zip([1,2,3,4], [5,6,7,8])
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> for i, b in enumerate(['a', 'b', 'c']):
	print 'n-ter Buchstabe:', i
	print 'Buchstabe:', b

	
n-ter Buchstabe: 0
Buchstabe: a
n-ter Buchstabe: 1
Buchstabe: b
n-ter Buchstabe: 2
Buchstabe: c 
5. Den Lambdaausdruck kannst du mit

Code: Alles auswählen

def enter_value(event):
    entry_obj = event.widget
    print(entry_obj.get())
vergleichen

//Edit schon wieder zu langsam :evil:
the more they change the more they stay the same
heiliga horsd

Danke euch beiden!
Ich versuche nun das ganze nochmal in Worten auszudrücken, um zu sehen, ob ich es verstanden habe:

1) Ich könnte statt "root" auch "Fernseher" benutzen, wenn ich Lust darauf hätte
2) Statt einem Unterstrich (_) könnte ich auch ein anderes Zeichen verwenden (bspw. ein "w")
3) zip nimmt als Argumente Listen entgegen und gibt dann eine neue Liste aus. Die neue Liste enthält Tupel und in jedem Tupel befindet sich das n-te Objekt der einzelnen (alten) Listen.
4) enumerate zählt letzendlich bloß durch
5) Der lambda-Ausdruck sorgt bei einem bestimmten Event (hier Enter-Taste) dafür, dass der Inhalt des Entry-Feldes ausgegeben wird.

Alles richtig verstanden?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Fast alles, in diesem Fall ruft der Lambdaausdruck nur die Funktion doit mit einem bestimmten Parameter auf, wenn man statt dem Lambdaasudruck nur seld.doit schreibt, wird self.doit() mit dem Eventparameter der von tkinter kommt aufgerufen
the more they change the more they stay the same
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

1) Ja, du kannst Namen beliebig wählen, so lange sie nicht mit einem reservierten Wort kollidieren (wie "for", "if", ...). Außerdem solltest du keine buil-in-Namen verdecken ("list", "dict", "set", ...)
2) Ja, jeden zulässigen Namen
3) Fast richtig: es können nicht nur Listen entgegengenommen werden, sonder alles über das iteriert werden kann. Schau dir auch noch den Sonderfall an, wenn nicht alle Listen die selbe Länge haben
4) Mal etwas anders ausgedrück: enumerate liefert zu jedem Wert noch seinen Index (den Start kann man beliebig einstellen). Auch hier kann wieder alles übergeben werden, über das auch iteriert werden kann
5) Das ist das, was am Schluß rauskommt. Ein lambda-Ausdruck ist eigentlich eine anonyme Funktion. Also eine Funktion ohne Namen. Jeden lambda-Ausdruck kannst du also auch in eine Funktion übersetzen:

Code: Alles auswählen

lambda x : x = 2*x

def function(x):
    return 2*x
@yipyip: Das geht aber noch ein wenig schöner. Mal ein Vorschlag:

Code: Alles auswählen

import Tkinter as tk

MAXI = 11

class Entries(object):
    def __init__(self, names, **keys):
        self.root = tk.Tk()

        for row, name in enumerate(names):
            var = tk.StringVar()
            entry = tk.Entry(self.root, textvariable=var, **keys)
            label = tk.Label(self.root, text=name)

            label.grid(column=0, row=row)
            entry.grid(column=1, row=row)
            entry.bind('<Return>', lambda e, v=var: self.doit(e, v.get()))
     
    def doit(self, event, var):
        print var

    def run(self):
        self.root.mainloop()

if __name__ == '__main__':
    Entries(map('Text{0:02d}'.format, range(MAXI)), width=20).run()
Das Leben ist wie ein Tennisball.
heiliga horsd

@ Dav1d: Nun warst du der schnellste :wink:

OK, dann habe ich wohl bis jetzt wieder Wissenslücken geschlossen und werde weiter machen, bis ich dann irgendwann wieder auf ein wohl unlösbares Problem finde, bei dem ihr mir dann (hoffentlich) auch wieder helfen könnt.

Danke an alle!!

edit: Doch nicht: Was bedeutet: Text{0:02d}
Habs ausprobiert, bin aber nicht drauf gekommen :?:
Zuletzt geändert von heiliga horsd am Samstag 6. Februar 2010, 19:08, insgesamt 1-mal geändert.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Bin wie immer der langsamste...

Mein Ansatz ruehrt daher, weil ich die Widgetlisten als Objektattribute beibehalten wollte, bei groeseren Programmen braucht man die meistens noch. Dafuer hat EyDu alles in einem Rutsch in einer for-Schleife erledigt mit lokalen Variablen erledigt. Sieht fuer diesen Fall etwas eleganter aus.

:wink:
yipyip
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@heiliga horsd:
Diese relativ neue format-Syntax ist auch fuer mich etwas ungewohnt.
Also http://docs.python.org/library/string.h ... ing-syntax lesen und ausprobieren:

Code: Alles auswählen

In [60]: "t{0} t{1:02d}".format(1,2)
Out[60]: 't1 t02'

In [61]: "t{0} t{1:x}".format(1,15)
Out[61]: 't1 tf'

In [62]: map("t{0:d}".format, range(4))
Out[62]: ['t0', 't1', 't2', 't3']
:wink:
yipyip
heiliga horsd

Also das ist nur zur Formatierung da? Alles klar Danke!
Antworten