Seite 1 von 1

Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Dienstag 17. November 2015, 18:53
von Alfons Mittelmeyer
tkinter liefert mir Referenzen auf Objekte als String in diesem Format: '.1092932752.4893008'
Kann ich das irgendwie benützen, damit ich auf das Objekt zugreifen kann?

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Dienstag 17. November 2015, 19:23
von Alfons Mittelmeyer
Würde mich interessieren. Inzwischen habe ich es anders gelöst. Ich suche meine Widgets ab, of str(my_widget) mit diesem String übereinstimmt.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Dienstag 17. November 2015, 23:21
von Sirius3
@Alfons Mittelmeyer: das sollte eigentlich nicht nötig sein. Man verliert ja nicht einfach Referenzen auf Objekte und muß sie daher auch nicht umständlich wiederfinden.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 01:00
von Alfons Mittelmeyer
@Sirius3 Wenn man bestimmte Referenzen nicht hat, dann kann man sie auch nicht verlieren. Ein Canvas window item enthält die Refernz auf ein Widget leider nur in dieser String Form.

Normalerweise wird es meist egal sein, wenn man nun so ein window item löscht, ob man dann weiß, dass Widgets, dann nicht mehr durch ein Canvas window item referenziert werden. Mir ist es aber nicht egal. Ich sollte aber eine sauberere Lösung implementieren. Die jetzige würde zwar reichen. Sie bezieht sich nur auf das momentan aktuelle Canvas window item. Diese Lösung wäre zwar ausreichen, jedoch nicht 100% sauber.

100% sauber wäre, wenn nach einem delete von Canvas items, zu denen auch Canvas window items gehören, die Information für alle Widgets upgedatet würde, ob sie noch durch Canvas window items referenziert würden.

Aber das geht dann wohl doch zu weit. Canvas window items, sind glaube ich nicht nur auf widgets im betreffenden Canvas beschränkt, oder? Das hieße dann wohl, dass ich mir zu jedem Widget nicht nur merken müßte, dass es von einem Canvas window item referenziert wird, sondern auch durch welches oder welche. Und nach einem delete von Canvas items müßte dann wohl auch die ganze GUI abgesucht werden, ob die Canvas window items noch vorhanden sind, welche die widgets referenziert hatten.

Die 100 prozentige Lösung sollte ich da wohl doch nicht versuchen, sondern mich mit der für den GuiDesigner ausreichenden Lösung bescheiden. Normalerweise hat man dort kein delete, weil man dort normalerweise nicht noch ein Programm dazu laufen läßt. Und wenn doch, dann macht es auch keinen großen Unterschied, ob es nun stimmt, dass das Widget ein WINDOWLAYOUT hat oder keines mehr. Da macht man dann eben manuell noch ein unlayout, damit wieder das Neuanlegen eines Canvas window items angeboten wird.

Hab es nochmals überprüft. Anscheinend gehen doch nur widgets im betreffenden Canvas. Da läßt sich dann doch die 100 pro Lösung machen. Denn nur die Widgets im betreffenden Container lassen sich leicht abchecken.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 08:26
von Sirius3
@Alfons Mittelmeyer: das ist mir zu verwirrend. Kannst Du ein kurzes Beispiel geben, wie Du eine Referenz verlieren kannst, die beim Löschen von irgendwas relevant sein soll?

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 12:49
von Alfons Mittelmeyer
@Sirius3

Es geht ja nicht um Referenzenzen, die man verloren hat, sondern um Referenzen, die man nicht anders hat.
Und das Problem taucht ja nicht nur an einer Stelle auf, sondern des Öfteren.

Etwa, wenn man den Inhalt eines Canvas abspeichern will, und zwar die Canvas Items in einem lesbaren Format.

Die Items findet man durch:

Code: Alles auswählen

item_list = mycanvas.find_all()
Wenn man die Item Liste abarbeitet, etwa durch:

Code: Alles auswählen

for item in item_list:
kann man auch abfragen, ob das Item einen Config Eintrag für 'window' enthält, etwa durch:

Code: Alles auswählen

mycanvas.itemcget(item,'window')
Das natürlich verbunden mit 'try'.
Und wenn man dann erhält:

Code: Alles auswählen

.1865232.1865744
Dann nützt das nicht viel.
Gebraucht hätte man eine verwendbare Referenz auf das Objekt.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 13:30
von Alfons Mittelmeyer
Für das Problem gäbe es drei Lösungsmöglichkeiten:

a) es gäbe so eine Funktion in Python
b) ich mache mir eine Funktion, die einen Suchlauf über die Children des Containers durchführt
c) ich modifiziere ein globales Dictionary, sodass es mir zu jeder Reference_as_string für ein existierendes Widget dessen Referenz zurückgibt. Das bedeutet natürlich mehr Speicherverbrauch.

Bislang sehen dort die Einträge so aus: Reference,None

Das wird von einer Funktion 'widget_exist(Reference)' benützt, um abzufragen, ob ein Widget noch existiert.
Würde ich die Dictionary Einträge so machen: Reference_as_string, Reference
Dann könnte man noch immer abfragen, ob ein widget noch existiert, aber auch eine richtige Referenz für eine Reference_as_string erhalten können.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 14:05
von BlackJack
@Alfons Mittelmeyer: Die `nametowidget()`-Methode sollte eigentlich funktionieren:

Code: Alles auswählen

In [2]: tk.Widget.nametowidget?
Type:       instancemethod
String Form:<unbound method Widget.nametowidget>
File:       /usr/lib/python2.7/lib-tk/Tkinter.py
Definition: tk.Widget.nametowidget(self, name)
Docstring:
Return the Tkinter instance of a widget identified by
its Tcl name NAME.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 14:39
von Alfons Mittelmeyer
@BlackJack Danke, funktioniert tatsächlich. Hätte ich eigentlich nicht gedacht, da diese Funktion eigentlich dafür da ist, eine Referenz auf ein Widget auf einen Namen hin zu liefern, den es ja auch in tkinter gibt. Doch hier handelt es sich nicht um einen Namen, sondern um eine Referenz in str(Referenz) gewandelt. Normalerweise hätte tkinter besser repr statt str genommen, da repr in Python verwendbar ist - etwa über Zuhilfenahme von eval - str dagegen nicht. Aber immerhin haben sie dieses Manko über nametowidget behoben.

Und übrigens braucht man da als parent auch gar nicht den parent anzugeben, sondern kann auch die root nehmen.

Re: Zugriff auf Objekte mit Adresse im Stringformat?

Verfasst: Mittwoch 18. November 2015, 14:51
von BlackJack
@Alfons Mittelmeyer: `str(tk_object)` liefert den Tk-Namen. Das Beispiel '.1092932752.4893008' aus dem ersten Beitrag ist keine Referenz oder Adresse sondern der Tk-Name für das Widget.