Button placement
I try for a while place the top button in a a middle of column=0 with span to column2 below so the button being centered to those, tried with canvas as well but with no success. Is someone with Tkinter experience able to advice what I could do? from tkinter import * from tkinter import ttk root = Tk() root.title('Password Generator') root.config(padx=10, pady=10) backg = '#06090f' canvas = Canvas(root, width=80, height=40).grid(column=0, row=0, columnspan=2,sticky=E) bgs = Button(canvas, text="Password Manager & Generator", background='#0f2a52', foreground="orange", font=("Times New Roman", 15, 'bold')).grid(column=0, row=0, pady=10, columnspan=2) long_t = Label(text='Password Length:') long_t.grid(column=0, row=1) choice_n = IntVar() choice = ttk.Combobox(width=10) w = [x for x in range(8, 16)] choice['values'] = w choice.grid(row=1, column=1) choice.current() choice.bind("<>") password_text = Label(text='Password: ') password_text.grid(row=2, column=0) password_entry = Entry(width=20) password_entry.grid(row=2, column=1) gen = Button(text='Generate Password') gen.grid(row=1, column=2, sticky=W) -- https://mail.python.org/mailman/listinfo/python-list
Re: Button placement
On 09/03/2021 03:08, Bischoop wrote: I try for a while place the top button in a a middle of column=0 with span to column2 below so the button being centered to those, I'm not sure what you mean, do you perhaps need columnspan=3? tried with canvas as well but with no success. Is someone with Tkinter experience able to advice what I could do? from tkinter import * from tkinter import ttk root = Tk() root.title('Password Generator') root.config(padx=10, pady=10) backg = '#06090f' # no Canvas bgs = Button( root, text="Password Manager & Generator", background='#0f2a52', foreground="orange", font=("Times New Roman", 15, 'bold') ) bgs.grid(column=0, row=0, pady=10, columnspan=3) long_t = Label(text='Password Length:') long_t.grid(column=0, row=1) choice_n = IntVar() choice = ttk.Combobox(width=10) w = [x for x in range(8, 16)] choice['values'] = w choice.grid(row=1, column=1) choice.current() choice.bind("<>") password_text = Label(text='Password: ') password_text.grid(row=2, column=0) password_entry = Entry(width=20) password_entry.grid(row=2, column=1) gen = Button(text='Generate Password') gen.grid(row=1, column=2, sticky=W) -- https://mail.python.org/mailman/listinfo/python-list
Re: Button placement
On 3/8/2021 9:08 PM, Bischoop wrote: I try for a while place the top button in a a middle of column=0 with span to column2 below so the button being centered to those, tried with canvas as well but with no success. Is someone with Tkinter experience able to advice what I could do? Say more clearly what you want/expect and what you are getting and why you are unhappy. -- Terry Jan Reedy -- https://mail.python.org/mailman/listinfo/python-list
Re: Button placement
On 2021-03-09, Peter Otten <__pete...@web.de> wrote: > On 09/03/2021 03:08, Bischoop wrote: >> >> I try for a while place the top button in a a middle of column=0 with >> span to column2 below so the button being centered to those, > > I'm not sure what you mean, do you perhaps need columnspan=3? > > You were sure :-) columnspan=3 helped, I didn't know that I can apply it to 3 when not having column=3, was trying just with columnspan=2 but as you know it didn't do the job. I was swearing when fighting with it with padding lol. -- Thanks > -- https://mail.python.org/mailman/listinfo/python-list
Re: Button placement
On 3/9/21 6:24 AM, Bischoop wrote: > On 2021-03-09, Peter Otten <__pete...@web.de> wrote: >> On 09/03/2021 03:08, Bischoop wrote: >>> I try for a while place the top button in a a middle of column=0 with >>> span to column2 below so the button being centered to those, >> I'm not sure what you mean, do you perhaps need columnspan=3? >> >> > You were sure :-) > columnspan=3 helped, I didn't know that I can apply it to 3 when not > having column=3, was trying just with columnspan=2 but as you know it > didn't do the job. I was swearing when fighting with it with padding lol. > > -- > Thanks One thing to remember is that span is sort of like range, range(3) is [0, 1, 2] -- Richard Damon -- https://mail.python.org/mailman/listinfo/python-list
Re: Button placement
On 2021-03-09, Richard Damon wrote: > > One thing to remember is that span is sort of like range, range(3) is > [0, 1, 2] > Right, ends on 2. Thanks again, that ended mine frustration lol. -- Thanks -- https://mail.python.org/mailman/listinfo/python-list
Re: Button placement
On 2021-03-09, Terry Reedy wrote: > > Say more clearly what you want/expect and what you are getting and why > you are unhappy. > It solved Terry, I wanted center the button on top, had only 3 columns (0,1,2) and was unaware that I could use "columnspan=3" as it ends on 2, I was using columnspan=2 :-) Thanks, anyway. -- Thanks -- https://mail.python.org/mailman/listinfo/python-list
Problem resizing a window and button placement
Python, Tkinter: How do I determine if a window has been resized? I want to locate buttons vertically along the right border and need to know the new width. The buttons are to move with the change of location of the right-side border. SGA -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2024-02-24 01:14, Steve GS via Python-list wrote: Python, Tkinter: How do I determine if a window has been resized? I want to locate buttons vertically along the right border and need to know the new width. The buttons are to move with the change of location of the right-side border. Bind an event handler for '': 8< import tkinter as tk def on_configure(*args): print(args) root = tk.Tk() root.bind('', on_configure) root.mainloop() 8< Are you placing the buttons yourself? I always use layouts and they handle such things automatically. -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
How do I extract the values from args? SGA -Original Message- From: Python-list On Behalf Of MRAB via Python-list Sent: Friday, February 23, 2024 9:27 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2024-02-24 01:14, Steve GS via Python-list wrote: > Python, Tkinter: How do I > determine if a window has been > resized? I want to locate > buttons vertically along the > right border and need to know > the new width. The buttons are > to move with the change of > location of the right-side > border. > Bind an event handler for '': 8< import tkinter as tk def on_configure(*args): print(args) root = tk.Tk() root.bind('', on_configure) root.mainloop() 8< Are you placing the buttons yourself? I always use layouts and they handle such things automatically. -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
> On 24 Feb 2024, at 04:36, Steve GS via Python-list > wrote: > > How do I extract the values > from args? You can look up the args in documentation. You can run the example code MRAB provided and see what is printed to learn what is in the args. Barry -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
Yes, I ran that elegantly simple code. The print statement reports the X, Y, Height and Width values. However, I do not see how to capture the width value. I experimented with the code Vwidth = rootV.winfo_width() and it also reports the width as I resize the window. However, I cannot seem to use the variable Vwidth outside the sub routine. It is acting as if Vwidth is not global but I added that. It is reported that Vwidth is not defined when I try to use it in my code. So close.. SGA -Original Message- From: Barry Sent: Saturday, February 24, 2024 3:04 AM To: Steve GS Cc: MRAB ; python-list@python.org Subject: Re: Problem resizing a window and button placement > On 24 Feb 2024, at 04:36, Steve GS via Python-list wrote: > > How do I extract the values > from args? You can look up the args in documentation. You can run the example code MRAB provided and see what is printed to learn what is in the args. Barry -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2/24/2024 3:20 AM, Steve GS via Python-list wrote: Yes, I ran that elegantly simple code. The print statement reports the X, Y, Height and Width values. However, I do not see how to capture the width value. I experimented with the code Vwidth = rootV.winfo_width() and it also reports the width as I resize the window. However, I cannot seem to use the variable Vwidth outside the sub routine. It is acting as if Vwidth is not global but I added that. It is reported that Vwidth is not defined when I try to use it in my code. Well, yes, in Python a variable created inside a function or method is local to that function unless you declare it global. That characteristic is called its "scope". But if you think you need it to be a global variable you should rethink your design. For one thing, before the next time you use your global variable the window size may have changed again. Instead, it would be better to have the function that responds to the resize event perform the action that you want, or call another function that does, passing the new width to it. Note that in most programming languages, variables have a scope. The rules about those scopes vary between languages. So close.. SGA -Original Message- From: Barry Sent: Saturday, February 24, 2024 3:04 AM To: Steve GS Cc: MRAB ; python-list@python.org Subject: Re: Problem resizing a window and button placement On 24 Feb 2024, at 04:36, Steve GS via Python-list wrote: How do I extract the values from args? You can look up the args in documentation. You can run the example code MRAB provided and see what is printed to learn what is in the args. Barry -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2024-02-24, MRAB via Python-list wrote: > On 2024-02-24 01:14, Steve GS via Python-list wrote: > >> Python, Tkinter: How do I determine if a window has been resized? I >> want to locate buttons vertically along the right border and need >> to know the new width. The buttons are to move with the change of >> location of the right-side border. > > Bind an event handler for '': > > 8< > [...] > 8< > > Are you placing the buttons yourself? I always use layouts and they > handle such things automatically. Yes, definitely what he said: use a layout manager. I hope this doesn't sound rude, but if you're calculating button positions based on window size, you're doing it wrong and will end up wasting a lot of time to produce something that won't work right. Use a layout manager: https://tkinterpython.top/layout/#:~:text=Tkinter%20has%20three%20built%2Din,%2C%20grid%20%2C%20and%20place%20managers. https://www.pythonguis.com/tutorials/create-ui-with-tkinter-pack-layout-manager/ https://www.pythonguis.com/tutorials/use-tkinter-to-design-gui-layout/ You'll have to spend a little time learning how they work, but in the end you'll get done sooner and have better results. -- Grant -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
"Well, yes, in Python a variable created inside a function or method is local to that function unless you declare it global." Yes, I knew that. I tried to global it both before the function call and within it. Same for when I created the variable. If I try to use it in the rest of the code, it keeps coming up as not declared. In other functions, I can 'return' the variable but that apparently would not work for this function. Is this type of function any different that that which I have been using? SGA -Original Message- From: Python-list On Behalf Of Thomas Passin via Python-list Sent: Saturday, February 24, 2024 8:40 AM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2/24/2024 3:20 AM, Steve GS via Python-list wrote: > Yes, I ran that elegantly > simple code. The print > statement reports the X, Y, > Height and Width values. > However, I do not see how to > capture the width value. > > I experimented with the code > Vwidth = rootV.winfo_width() > and it also reports the width > as I resize the window. > > However, I cannot seem to use > the variable Vwidth outside > the sub routine. It is acting > as if Vwidth is not global but > I added that. It is reported > that Vwidth is not defined > when I try to use it in my > code. Well, yes, in Python a variable created inside a function or method is local to that function unless you declare it global. That characteristic is called its "scope". But if you think you need it to be a global variable you should rethink your design. For one thing, before the next time you use your global variable the window size may have changed again. Instead, it would be better to have the function that responds to the resize event perform the action that you want, or call another function that does, passing the new width to it. Note that in most programming languages, variables have a scope. The rules about those scopes vary between languages. > > So close.. > SGA > > -Original Message- > From: Barry > > Sent: Saturday, February 24, > 2024 3:04 AM > To: Steve GS > > Cc: MRAB > ; > python-list@python.org > Subject: Re: Problem resizing > a window and button placement > > > >> On 24 Feb 2024, at 04:36, > Steve GS via Python-list > > wrote: >> >> How do I extract the values >> from args? > > You can look up the args in > documentation. > You can run the example code > MRAB provided and see what is > printed to learn what is in > the args. > > Barry > > -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2024-02-25 00:33, Steve GS via Python-list wrote: "Well, yes, in Python a variable created inside a function or method is local to that function unless you declare it global." Yes, I knew that. I tried to global it both before the function call and within it. Same for when I created the variable. If I try to use it in the rest of the code, it keeps coming up as not declared. In other functions, I can 'return' the variable but that apparently would not work for this function. Is this type of function any different that that which I have been using? Please post a short example that shows the problem. -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
import tkinter as tk #global Ww Neither global helps def on_configure(*args): # print(args) #global Ww Neither global helps Ww = root.winfo_width() print("WwInside = <" + str(Ww) + ">") root = tk.Tk() root.bind('', on_configure) print("WwOutside = <" + str(Ww) + ">") #NameError: name 'Ww' is not defined root.mainloop() SGA -Original Message- From: Python-list On Behalf Of MRAB via Python-list Sent: Saturday, February 24, 2024 7:49 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2024-02-25 00:33, Steve GS via Python-list wrote: > "Well, yes, in Python a > variable created inside a > function or method is local to > that function unless you > declare it global." > > Yes, I knew that. I tried to > global it both before the > function call and within it. > Same for when I created the > variable. If I try to use it > in the rest of the code, it > keeps coming up as not > declared. In other functions, > I can 'return' the variable > but that apparently would not > work for this function. > > Is this type of function any > different that that which I > have been using? > Please post a short example that shows the problem. -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2/24/2024 9:51 PM, Steve GS via Python-list wrote: First of all, please make sure that the formatting is readable and especially the indentation. This is Python, after all. Do not use tabs; use 3 or 4 spaces instead of each tab. import tkinter as tk #global Ww Neither global helps def on_configure(*args): # print(args) #global Ww Neither global helps Ww = root.winfo_width() print("WwInside = <" + str(Ww) + ">") root = tk.Tk() root.bind('', on_configure) print("WwOutside = <" + str(Ww) + ">") #NameError: name 'Ww' is not defined The function that declares Ww hasn't run yet. As I wrote earlier, the function bound to the callback should do all the work for the callback, or it should call other functions that do. That's if you don't let a layout do it all for you, as others have written. root.mainloop() SGA -Original Message- From: Python-list On Behalf Of MRAB via Python-list Sent: Saturday, February 24, 2024 7:49 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2024-02-25 00:33, Steve GS via Python-list wrote: "Well, yes, in Python a variable created inside a function or method is local to that function unless you declare it global." Yes, I knew that. I tried to global it both before the function call and within it. Same for when I created the variable. If I try to use it in the rest of the code, it keeps coming up as not declared. In other functions, I can 'return' the variable but that apparently would not work for this function. Is this type of function any different that that which I have been using? Please post a short example that shows the problem. -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2024-02-25 02:51, Steve GS wrote: import tkinter as tk #global Ww Neither global helps def on_configure(*args): # print(args) #global Ww Neither global helps Ww = root.winfo_width() print("WwInside = <" + str(Ww) + ">") root = tk.Tk() root.bind('', on_configure) print("WwOutside = <" + str(Ww) + ">") #NameError: name 'Ww' is not defined root.mainloop() 'Ww' won't exist until 'on_configure' assigns to it, and that won't happen until `mainloop` starts. Also, 'global' works only within a function. 8< import tkinter as tk def on_configure(event): print(f'{event.width=}, {event.height=}') root = tk.Tk() root.bind('',on_configure) root.mainloop() 8< -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
The print statement in the function prints. Does that not mean that the function is being called? SGA -Original Message- From: Python-list On Behalf Of Thomas Passin via Python-list Sent: Saturday, February 24, 2024 10:39 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2/24/2024 9:51 PM, Steve GS via Python-list wrote: First of all, please make sure that the formatting is readable and especially the indentation. This is Python, after all. Do not use tabs; use 3 or 4 spaces instead of each tab. > import tkinter as tk > > #global Ww Neither global > helps > def on_configure(*args): > # print(args) > #global Ww Neither > global helps > Ww = root.winfo_width() > print("WwInside = <" + > str(Ww) + ">") > > root = tk.Tk() > root.bind('', > on_configure) > print("WwOutside = <" + > str(Ww) + ">") > #NameError: name 'Ww' is not > defined The function that declares Ww hasn't run yet. As I wrote earlier, the function bound to the callback should do all the work for the callback, or it should call other functions that do. That's if you don't let a layout do it all for you, as others have written. > root.mainloop() > > SGA > > -Original Message- > From: Python-list > sga.ni...@python.org> On > Behalf Of MRAB via Python-list > Sent: Saturday, February 24, > 2024 7:49 PM > To: python-list@python.org > Subject: Re: Problem resizing > a window and button placement > > On 2024-02-25 00:33, Steve GS > via Python-list wrote: >> "Well, yes, in Python a >> variable created inside a >> function or method is local > to >> that function unless you >> declare it global." >> >> Yes, I knew that. I tried to >> global it both before the >> function call and within it. >> Same for when I created the >> variable. If I try to use it >> in the rest of the code, it >> keeps coming up as not >> declared. In other > functions, >> I can 'return' the variable >> but that apparently would > not >> work for this function. >> >> Is this type of function any >> different that that which I >> have been using? >> > Please post a short example > that shows the problem. > -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
So, how do I use the width value in my code? SGA -Original Message- From: Python-list On Behalf Of MRAB via Python-list Sent: Saturday, February 24, 2024 10:36 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2024-02-25 02:51, Steve GS wrote: > import tkinter as tk > > #global Ww Neither global helps > def on_configure(*args): > # print(args) > #global Ww Neither global helps > Ww = root.winfo_width() > print("WwInside = <" + str(Ww) + ">") > > root = tk.Tk() > root.bind('', on_configure) print("WwOutside = <" + str(Ww) > + ">") > #NameError: name 'Ww' is not defined > root.mainloop() 'Ww' won't exist until 'on_configure' assigns to it, and that won't happen until `mainloop` starts. Also, 'global' works only within a function. 8< import tkinter as tk def on_configure(event): print(f'{event.width=}, {event.height=}') root = tk.Tk() root.bind('',on_configure) root.mainloop() 8< -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2/25/2024 4:19 PM, Steve GS via Python-list wrote: SOLUTION FOUND! The fix was to write the code that uses the width value and to place it into the function itself. Kluge? Maybe but it works. Right, just what I wrote earlier: "have the function that responds to the resize event perform the action that you want" Mischief Managed. As for the most recent suggestion, it fails for me: Traceback (most recent call last): File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in print("Ww Outside = <" + str(Ww) > + ">") TypeError: bad operand type for unary +: 'str' With the need to close the window, it adds an extra step and intervention to the program to use. I am not sure how this help[s. As a curio, it would be interesting to see how to use the value of a variable, created in the function used here, and make it available to the code outside the function. SGA -Original Message- From: Alan Gauld Sent: Sunday, February 25, 2024 12:44 PM To: Steve GS ; python-list@python.org Subject: Re: RE: Problem resizing a window and button placement On 25/02/2024 03:58, Steve GS via Python-list wrote: import tkinter as tk Ww = None def on_configure(*args): global Ww Ww = root.winfo_width() print("Ww Inside = <" + str(Ww) + ">") root = tk.Tk() root.bind('', on_configure) root.mainloop() print("Ww Outside = <" + str(Ww) > + ">") Produces: Ww Inside = <200> Ww Inside = <200> Ww Inside = <205> Ww Inside = <205> Ww Inside = <206> Ww Inside = <206> Ww Outside = <206> HTH -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2024-02-25 21:19, Steve GS via Python-list wrote: SOLUTION FOUND! The fix was to write the code that uses the width value and to place it into the function itself. Kluge? Maybe but it works. Mischief Managed. As for the most recent suggestion, it fails for me: Traceback (most recent call last): File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in print("Ww Outside = <" + str(Ww) > + ">") TypeError: bad operand type for unary +: 'str' It fails because there's a mistake. It should be: print("Ww Outside = <" + str(Ww) + ">") With the need to close the window, it adds an extra step and intervention to the program to use. I am not sure how this help[s. As a curio, it would be interesting to see how to use the value of a variable, created in the function used here, and make it available to the code outside the function. [snip] -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
Ww Inside = <250> Ww Inside = <249> Ww Inside = <250> Ww Outside = <1770662408256on_configure> Here is my result... SGA -Original Message- From: Python-list On Behalf Of MRAB via Python-list Sent: Sunday, February 25, 2024 6:40 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2024-02-25 21:19, Steve GS via Python-list wrote: > SOLUTION FOUND! > > The fix was to write the code that uses the width value and to place it into the function itself. > Kluge? Maybe but it works. > > Mischief Managed. > > > As for the most recent suggestion, it fails for me: > > Traceback (most recent call last): >File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in > print("Ww Outside = <" + str(Ww) > + ">") > TypeError: bad operand type for unary +: 'str' > It fails because there's a mistake. It should be: print("Ww Outside = <" + str(Ww) + ">") > With the need to close the window, it adds an extra step and intervention to the program to use. I am not sure how this help[s. > > As a curio, it would be interesting to see how to use the value of a variable, created in the function used here, and make it available to the code outside the function. > [snip] -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
Musta misstit I had thought of that before I started the discussion but figured it would take more code than it finally needed. I guess I was also variable-dependent thinking that I would need the result elsewhere in the code. So far, I see that I don't need the value. Then there is that discovery element: Why is my original idea not working? I still cannot pass the value back from the function. What is different about this function that others would have given me the value? SGA -Original Message- From: Python-list On Behalf Of Thomas Passin via Python-list Sent: Sunday, February 25, 2024 5:55 PM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2/25/2024 4:19 PM, Steve GS via Python-list wrote: > SOLUTION FOUND! > > The fix was to write the code that uses the width value and to place it into the function itself. > Kluge? Maybe but it works. Right, just what I wrote earlier: "have the function that responds to the resize event perform the action that you want" > Mischief Managed. > > > As for the most recent suggestion, it fails for me: > > Traceback (most recent call last): >File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in > print("Ww Outside = <" + str(Ww) > + ">") > TypeError: bad operand type for unary +: 'str' > > With the need to close the window, it adds an extra step and intervention to the program to use. I am not sure how this help[s. > > As a curio, it would be interesting to see how to use the value of a variable, created in the function used here, and make it available to the code outside the function. > > > > SGA > > -Original Message- > From: Alan Gauld > Sent: Sunday, February 25, 2024 12:44 PM > To: Steve GS ; python-list@python.org > Subject: Re: RE: Problem resizing a window and button placement > > On 25/02/2024 03:58, Steve GS via Python-list wrote: > import tkinter as tk > > Ww = None > > def on_configure(*args): > global Ww > Ww = root.winfo_width() > print("Ww Inside = <" + str(Ww) + ">") > > root = tk.Tk() > root.bind('', on_configure) > root.mainloop() > > print("Ww Outside = <" + str(Ww) > + ">") > > Produces: > Ww Inside = <200> > Ww Inside = <200> > Ww Inside = <205> > Ww Inside = <205> > Ww Inside = <206> > Ww Inside = <206> > Ww Outside = <206> > > HTH > -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: Problem resizing a window and button placement
On 2/26/2024 6:02 AM, Steve GS via Python-list wrote: Although your code produces the value of Ww outside the function, I do not see how I can use the value of Ww unless I close the program. The configuration event hasn't fired at the time you include the print statement in the handler's def block, and therefore the print function inside your handler hasn't invoked. It won't be invoked until you resize the window. There is no point to saving the width and height outside your on_configure() function, because outside that function you can't know if they have been changed. There could even have been a race condition where you use one but the other changes before you get around to using it. It's better just to ask tk for the values whenever you need them, as you do inside your handler. import tkinter as tk Ww = None # What does this do? Why not Integer? WwZ = None # These could be integers, like 0, but that would not be the correct # window sizes at that point. The window is either not constructed or it # has some definite size that is not zero. def on_configure(*args): global Ww global WwZ Ww = root.winfo_width() print("9 Ww Inside =<"+str(Ww)+">") # works WwZ = Ww * 2 print("11 WwZ Inside =<"+str(WwZ)+">") # works return(Ww) #Can I use this? root = tk.Tk() root.bind('',on_configure) print("15 Ww Inside1 = <"+str(Ww)+">") #Ww2 = int(Ww) * 2 # fails print("17 WwZ Inside2 = <"+str(WwZ)+">") root.mainloop() Ww2 = int(Ww) * 2 #Works but only after the program stops print("21 Ww Outside2 = <"+str(WwZ)+">") # Can I have concentric loops? SGA -Original Message- From: Alan Gauld Sent: Monday, February 26, 2024 4:04 AM To: Steve GS ; python-list@python.org Subject: Re: RE: Problem resizing a window and button placement On 26/02/2024 07:56, Steve GS via Python-list wrote: Then there is that discovery element: Why is my original idea not working? I still cannot pass the value back from the function. What is different about this function that others would have given me the value? There is nothing different, see the code below. print() is a function like any other. In this case it is called after you close the window, ie after mainloop() exits. But any other function called inside mainloop - eg any other event handler can also access it. For example, if you added a button: def printW(): print("Button Ww = ", Ww) bw = tk.Button(root, text="Print Width", command=printW) bw.pack() You would be able to print the value on demand. import tkinter as tk Ww = None def on_configure(*args): global Ww Ww = root.winfo_width() print("Ww Inside =<"+str(Ww)+">") root = tk.Tk() root.bind('',on_configure) root.mainloop() print("Ww Outside = <"+str(Ww)+">") -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list
RE: Problem resizing a window and button placement
>> The configuration event hasn't fired at the time you include the print statement in the handler's def block, and therefore the print function inside your handler hasn't invoked. It won't be invoked until you resize the window. Exactly >> There is no point (really?) to saving the width and height outside your on_configure() function, because outside that function you can't know if they have been changed. There could even have been a race condition where you use one but the other changes before you get around to using it. Aside from using it to resized the window, is there no way to know the last value of the change for use in the program? I could write the value to a label and read it back later in the process but that sounds to be klugy. >> It's better just to ask tk for the values whenever you need them, as you do inside your handler. How would that be done? SGA -Original Message- From: Python-list On Behalf Of Thomas Passin via Python-list Sent: Monday, February 26, 2024 8:34 AM To: python-list@python.org Subject: Re: Problem resizing a window and button placement On 2/26/2024 6:02 AM, Steve GS via Python-list wrote: > Although your code produces the value of Ww outside the function, I do not see how I can use the value of Ww unless I close the program. The configuration event hasn't fired at the time you include the print statement in the handler's def block, and therefore the print function inside your handler hasn't invoked. It won't be invoked until you resize the window. There is no point to saving the width and height outside your on_configure() function, because outside that function you can't know if they have been changed. There could even have been a race condition where you use one but the other changes before you get around to using it. It's better just to ask tk for the values whenever you need them, as you do inside your handler. > import tkinter as tk > > Ww = None # What does this do? Why not Integer? > WwZ = None # These could be integers, like 0, but that would not be the correct # window sizes at that point. The window is either not constructed or it # has some definite size that is not zero. > def on_configure(*args): > global Ww > global WwZ > Ww = root.winfo_width() > print("9 Ww Inside =<"+str(Ww)+">") # works > WwZ = Ww * 2 > print("11 WwZ Inside =<"+str(WwZ)+">") # works > return(Ww) #Can I use this? > > root = tk.Tk() > root.bind('',on_con figure) > print("15 Ww Inside1 = <"+str(Ww)+">") > #Ww2 = int(Ww) * 2 # fails > print("17 WwZ Inside2 = <"+str(WwZ)+">") > > root.mainloop() > > Ww2 = int(Ww) * 2 #Works but only after the program stops > print("21 Ww Outside2 = <"+str(WwZ)+">") # Can I have concentric > loops? > > > SGA > > -Original Message- > From: Alan Gauld > Sent: Monday, February 26, 2024 4:04 AM > To: Steve GS ; python-list@python.org > Subject: Re: RE: Problem resizing a window and button placement > > On 26/02/2024 07:56, Steve GS via Python-list wrote: > >> Then there is that discovery >> element: Why is my original >> idea not working? I still >> cannot pass the value back >> from the function. What is >> different about this function >> that others would have given >> me the value? > > There is nothing different, see the code below. > print() is a function like any other. > In this case it is called after you close the window, ie after mainloop() exits. > But any other function called inside > mainloop - eg any other event handler can also access it. > > For example, if you added a button: > > def printW(): print("Button Ww = ", Ww) > > bw = tk.Button(root, text="Print Width", command=printW) > bw.pack() > > You would be able to print the value on demand. > >>> import tkinter as tk >>> >>> Ww = None >>> >>> def on_configure(*args): >>> global Ww >>> Ww = root.winfo_width() >>> print("Ww Inside =<"+str(Ww)+">") >>> >>> root = tk.Tk() >>> root.bind('',on_con figure) >>> root.mainloop() >>> >>> print("Ww Outside = <"+str(Ww)+">") > > -- > Alan G > Author of the Learn to Program web site http://www.alan-g.me.uk/ > http://www.amazon.com/author/a lan_gauld > Follow my photo-blog on Flickr at: > http://www.flickr.com/photos/a langauldphotos > > -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: RE: Problem resizing a window and button placement
On 25/02/2024 03:58, Steve GS via Python-list wrote: import tkinter as tk Ww = None def on_configure(*args): global Ww Ww = root.winfo_width() print("Ww Inside = <" + str(Ww) + ">") root = tk.Tk() root.bind('', on_configure) root.mainloop() print("Ww Outside = <" + str(Ww) > + ">") Produces: Ww Inside = <200> Ww Inside = <200> Ww Inside = <205> Ww Inside = <205> Ww Inside = <206> Ww Inside = <206> Ww Outside = <206> HTH -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list
RE: RE: Problem resizing a window and button placement
SOLUTION FOUND! The fix was to write the code that uses the width value and to place it into the function itself. Kluge? Maybe but it works. Mischief Managed. As for the most recent suggestion, it fails for me: Traceback (most recent call last): File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in print("Ww Outside = <" + str(Ww) > + ">") TypeError: bad operand type for unary +: 'str' With the need to close the window, it adds an extra step and intervention to the program to use. I am not sure how this help[s. As a curio, it would be interesting to see how to use the value of a variable, created in the function used here, and make it available to the code outside the function. SGA -Original Message- From: Alan Gauld Sent: Sunday, February 25, 2024 12:44 PM To: Steve GS ; python-list@python.org Subject: Re: RE: Problem resizing a window and button placement On 25/02/2024 03:58, Steve GS via Python-list wrote: import tkinter as tk Ww = None def on_configure(*args): global Ww Ww = root.winfo_width() print("Ww Inside = <" + str(Ww) + ">") root = tk.Tk() root.bind('', on_configure) root.mainloop() print("Ww Outside = <" + str(Ww) > + ">") Produces: Ww Inside = <200> Ww Inside = <200> Ww Inside = <205> Ww Inside = <205> Ww Inside = <206> Ww Inside = <206> Ww Outside = <206> HTH -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list
Re: RE: Problem resizing a window and button placement
On 26/02/2024 07:56, Steve GS via Python-list wrote: > Then there is that discovery > element: Why is my original > idea not working? I still > cannot pass the value back > from the function. What is > different about this function > that others would have given > me the value? There is nothing different, see the code below. print() is a function like any other. In this case it is called after you close the window, ie after mainloop() exits. But any other function called inside mainloop - eg any other event handler can also access it. For example, if you added a button: def printW(): print("Button Ww = ", Ww) bw = tk.Button(root, text="Print Width", command=printW) bw.pack() You would be able to print the value on demand. >> import tkinter as tk >> >> Ww = None >> >> def on_configure(*args): >> global Ww >> Ww = root.winfo_width() >> print("Ww Inside =<"+str(Ww)+">") >> >> root = tk.Tk() >> root.bind('',on_configure) >> root.mainloop() >> >> print("Ww Outside = <"+str(Ww)+">") -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list
RE: RE: Problem resizing a window and button placement
Although your code produces the value of Ww outside the function, I do not see how I can use the value of Ww unless I close the program. import tkinter as tk Ww = None # What does this do? Why not Integer? WwZ = None def on_configure(*args): global Ww global WwZ Ww = root.winfo_width() print("9 Ww Inside =<"+str(Ww)+">") # works WwZ = Ww * 2 print("11 WwZ Inside =<"+str(WwZ)+">") # works return(Ww) #Can I use this? root = tk.Tk() root.bind('',on_configure) print("15 Ww Inside1 = <"+str(Ww)+">") #Ww2 = int(Ww) * 2 # fails print("17 WwZ Inside2 = <"+str(WwZ)+">") root.mainloop() Ww2 = int(Ww) * 2 #Works but only after the program stops print("21 Ww Outside2 = <"+str(WwZ)+">") # Can I have concentric loops? SGA -Original Message- From: Alan Gauld Sent: Monday, February 26, 2024 4:04 AM To: Steve GS ; python-list@python.org Subject: Re: RE: Problem resizing a window and button placement On 26/02/2024 07:56, Steve GS via Python-list wrote: > Then there is that discovery > element: Why is my original > idea not working? I still > cannot pass the value back > from the function. What is > different about this function > that others would have given > me the value? There is nothing different, see the code below. print() is a function like any other. In this case it is called after you close the window, ie after mainloop() exits. But any other function called inside mainloop - eg any other event handler can also access it. For example, if you added a button: def printW(): print("Button Ww = ", Ww) bw = tk.Button(root, text="Print Width", command=printW) bw.pack() You would be able to print the value on demand. >> import tkinter as tk >> >> Ww = None >> >> def on_configure(*args): >> global Ww >> Ww = root.winfo_width() >> print("Ww Inside =<"+str(Ww)+">") >> >> root = tk.Tk() >> root.bind('',on_configure) >> root.mainloop() >> >> print("Ww Outside = <"+str(Ww)+">") -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list
Re: RE: Problem resizing a window and button placement
On 27/02/2024 07:13, Steve GS via Python-list wrote: > Aside from using it to resized > the window, is there no way to > know the last value of the > change for use in the program? The last value would be the current width. And you know how to get that as shown in your configure function: Ww = root.winfo_width() > I could write the value to a > label and read it back later That's no different to writing it to global Ww and accessing that as demonstrated in my last code post (with button). >>> It's better just to ask tk > for the values whenever you > need them, as you do inside > your handler. > > How would that be done? Ww = root.winfo_width() Provided you can access the root widget (which is (nearly?) always true) you can get the width of the main window. But can I ask if you have a particular use-case in mind for this? We started out talking about relocating some widgets when the window was resized. We established that the best place to do that was inside the configure event handler, with no need to store the width. (assuming you aren't using a dynamic layout manager(grid/pack/form) which would be better still!) We've now moved on to the more general issue of communicating values between event handlers (although still using the width as our exemplar). Is this just academic interest or do you have a specific need for this? If we know the need we might be able to suggest a specific (and possibly better?)solution. -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list
Re: RE: RE: Problem resizing a window and button placement
On 26/02/2024 11:02, Steve GS via Python-list wrote: > Although your code produces the value of Ww outside the function, > I do not see how I can use the value of Ww unless I close the program. You have to use a function that operates inside the mainloop. Thats the nature of event driven programs, all activity happens inside the mainloop except initialisation and cleanup. So you need to create an event handler as I described below. Here is the complete program including the button: ### import tkinter as tk Ww=None def on_configure(*args): global Ww Ww = root.winfo_width() print("Ww Inside = <" + str(Ww) + ">") def printW(): print("Button Ww = ", Ww) root = tk.Tk() bw = tk.Button(root, text="Print Width", command=printW) bw.pack() root.bind('', on_configure) root.mainloop() print("Ww Outside = <" + str(Ww) + ">") Notice that the button callback picks up the latest value of Ww. -- Alan G Author of the Learn to Program web site http://www.alan-g.me.uk/ http://www.amazon.com/author/alan_gauld Follow my photo-blog on Flickr at: http://www.flickr.com/photos/alangauldphotos -- https://mail.python.org/mailman/listinfo/python-list