Re: How to correctly use 'in_' argument in tkinter grid()?

2019-09-10 Thread jfong
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()?

2019-09-10 Thread Peter Otten
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