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.
Wer will Widget IDs haben?
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Stimmt nicht mehr, jetzt sind es 17 Zeilen
- DeaD_EyE
- User
- Beiträge: 1021
- 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.
[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
-
- User
- Beiträge: 1715
- Registriert: Freitag 31. Juli 2015, 13:34
Gibt es irgendwo ein Dictionary children? Es gibt doch nur eine children Liste, die man mit winfo_children() bekommt, oder?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.
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)