Forum: PC-Programmierung Python Anfängerfrage


von Guest (Gast)


Lesenswert?

Hallo!

Ich bin Python-Neuling und habe folgendes Problem:

Bei einer Auflistung, die ich normal mit Labels aus tkinter 
bewerkstellige, platziere ich innerhalb einer for-Schleife Buttons, die 
einen bestimmten Eintrag der Liste löschen sollen.

buttonLoeschen.append(Button(fenster, text="Löschen", command= lambda: 
loescheBt(i)))

Das Problem ist, dass zum Zeitpunkt, wo ich den Button klicke, die 
for-Schleife natürlich fertig ist, sodass i (die Zählvariable der 
for-Schleife) dem Index des letzten Eintrages entspricht.

Somit wird das letzte Element gelöscht, statt dem, wo der Button ist.

Nun suche ich nach einer Möglichkeit, das "i" zu konservieren. Also der 
command soll das i fix behalten, das beim Erstellen des Buttons gültig 
war.

Bitte um Hilfe.
Danke!

von Flo (Gast)


Lesenswert?

Verstehe ich das Problem richtig?

Eine for-Schleife erzeugt n Buttons. Der i-te Button soll (nachdem alle 
Buttons erzeugt wurden) das i-te Element aus einer Liste löschen.

von sven (Gast)


Lesenswert?

Kann man nicht die ID oder Namen des Buttons abfragen?

von Guest (Gast)


Lesenswert?

Flo schrieb:
> Verstehe ich das Problem richtig?
>
> Eine for-Schleife erzeugt n Buttons. Der i-te Button soll (nachdem alle
> Buttons erzeugt wurden) das i-te Element aus einer Liste löschen.

Genau richtig!

sven schrieb:
> Kann man nicht die ID oder Namen des Buttons abfragen?

Die Buttons sind auch in einer Liste, man bräuchte also leider auch 
dafür die Variable i.

von Flo (Gast)


Lesenswert?

Vielleicht hilft dir eine mehrdimensionale Liste oder ein Dictionary?

von Flof (Gast)


Lesenswert?

Du musst i beim Anlegen des lambdas binden: lamba i=i: loescheBit(i)

Das bindet die variable beim Anlegen des lambdas über den Standartwert. 
Eine der wenigen hässlichen Stellen Pythons.

von yesitsme (Gast)


Lesenswert?

Vielleicht helfen auch die functools...
1
# python
2
Python 2.7.13 (default, Nov 24 2017, 17:33:09)
3
[GCC 6.3.0 20170516] on linux2
4
Type "help", "copyright", "credits" or "license" for more information.
5
>>> from __future__ import print_function
6
>>> import functools
7
>>> i=5
8
>>> f = functools.partial(lambda x:print(x), i)
9
>>> f()
10
5
11
>>> i=9
12
>>> f()
13
5

von Guest (Gast)


Lesenswert?

Flof schrieb:
> Du musst i beim Anlegen des lambdas binden: lamba i=i: loescheBit(i)
>
> Das bindet die variable beim Anlegen des lambdas über den Standartwert.
> Eine der wenigen hässlichen Stellen Pythons.

Funktioniert perfekt!!
Vielen Dank!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.