Wer will Widget IDs haben?

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Wer will Widget IDs haben? So wie sie Pygubu bietet. Die lassen sich mit 27 Zeilen Code (Leerzeilen mitgezählt) leicht erzeugen.
Ermöglichen aber einen kreuz und quer Zugriff auf alle Widgets der GUI, fördern damit einen Code Verhau und zerstören damit für viele die Hoffnung, komplexe GUI Programme fertig zu bringen.

Also 27 Zeilen Code machen das möglich. Man braucht nur für ein Widget bei der Anlage den tk Namen (Parameter name) übergeben und schon kann man dann auf dieses von überall her zugreifen. Also, sehr einfach zu handhaben.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Stimmt nicht mehr, jetzt sind es 17 Zeilen
Benutzeravatar
DeaD_EyE
User
Beiträge: 1011
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

So?

[codebox=pycon file=Unbenannt.txt]
def get_widget(root, wid):
for key, value in root.children.items():
if key == wid:
return value
child = get_widget(value, wid)
if child:
return child
[/code]

Bin mal auf deine Lösung gespannt. Meine hab ich nicht ganz getestet.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

DeaD_EyE hat geschrieben:So?

[codebox=pycon file=Unbenannt.txt]
def get_widget(root, wid):
for key, value in root.children.items():
if key == wid:
return value
child = get_widget(value, wid)
if child:
return child
[/code]

Bin mal auf deine Lösung gespannt. Meine hab ich nicht ganz getestet.
Gibt es irgendwo ein Dictionary children? Es gibt doch nur eine children Liste, die man mit winfo_children() bekommt, oder?

Meine Lösung ist so. Ich habe es dann noch als Klasse gemacht, weil manche darauf ganz versessen sind. Obwohl man ja doch nur eine root haben kann.

Code: Alles auswählen

import re

class Builder:
    def __init__(self,root):
        self.name_dict = {}
        self.build_names(root,self.name_dict)

    def get_object(self,id):
        return self.name_dict[id]

    def build_names(self,container,name_dict):
        for child in container.winfo_children():
            name = str(child).split('.')[-1]
            if name[0] == '#': # for exported GuiDesigner Sources (with names)
                name = re.split('[#]\d+[_]',name)[-1]
            name_dict[name] = child
            self.build_names(child,name_dict)
Vielleicht sollte man die Root auch mit hineinschreiben? Aber wie soll die heißen? Vielleicht '.' oder 'root' ?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons
Alfons hat geschrieben:Wer will Widget IDs haben?
In Tkinter braucht es doch nur gerade eine Zeile (ohne Leerzeichen) um die ID eines Widgets zu bekommen.

widget.winfo_id()

Gruss wuf :wink:
Take it easy Mates!
Antworten