Re: How to correctly use 'in_' argument in tkinter grid()?
Peter Otten於 2019年9月10日星期二 UTC+8下午5時04分27秒寫道: > 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 > $ Oh, I was misunderstanding the purpose of 'in_'. No wonder it's showing up in the .grid() manager:-) Thank you. --Jach -- https://mail.python.org/mailman/listinfo/python-list
Re: How to correctly use 'in_' argument in tkinter grid()?
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
How to correctly use 'in_' argument in tkinter grid()?
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 -- https://mail.python.org/mailman/listinfo/python-list