How to correctly use 'in_' argument in tkinter grid()?
jfong at ms4.hinet.net
jfong at ms4.hinet.net
Tue Sep 10 06:28:25 EDT 2019
Peter Otten於 2019年9月10日星期二 UTC+8下午5時04分27秒寫道:
> jfong at 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
More information about the Python-list
mailing list