jf...@ms4.hinet.net wrote: > I had tried the following script test.py: > -------- > import tkinter as tk > > class Demo(tk.Frame): > def __init__(self): > tk.Frame.__init__(self, name='demo') > self.pack() > > panel = tk.Frame(self, name='panel') > panel.pack() > > start = tk.Button(text='Start', name='start') > start.grid(in_=panel) > > btn = self.nametowidget('panel.start') > btn.config(state='disabled') > > Demo().mainloop() > -------- > > It fails on nametowidget() function. My intention is to use 'in_' to > change the parent of 'start' widget from the default Tk object to 'panel', > but failed with KeyError: 'start'. > > below is part of the snapshot in pdb, > ... >> d:\works\python\test.py(11)__init__() > -> start = tk.Button(text='Start', name='start') > (Pdb) !panel.winfo_parent() > '.demo' > (Pdb) next >> d:\works\python\test.py(12)__init__() > -> start.grid(in_=panel) > (Pdb) !start.winfo_parent() > '.' > (Pdb) next >> d:\works\python\test.py(14)__init__() > -> btn = self.nametowidget('panel.start') > (Pdb) !start.winfo_parent() > '.' > > --Jach
I think that the `in_` argument is used correctly. It's just that your expectation that the name is changed to reflect the layout hierarchy is wrong. To manipulate the start button you can use the `start` variable directly: start.config(state='disabled') To find all slaves of the panel use panel.grid_slaves() $ cat grid_in.py import tkinter as tk class Demo(tk.Frame): def __init__(self): tk.Frame.__init__(self, name='demo') self.pack() self.panel = panel = tk.Frame(self, name='panel') panel.pack() start = tk.Button(text='Start', name='start') start.grid(in_=panel) for btn in panel.grid_slaves(): print("disabling", btn._w) btn.config(state='disabled') Demo() #.mainloop() $ python3 grid_in.py disabling .start $ -- https://mail.python.org/mailman/listinfo/python-list