Discussion:
Problem resizing a window and button placement
(too old to reply)
Steve GS
2024-02-24 01:14:00 UTC
Permalink
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
MRAB
2024-02-24 02:26:43 UTC
Permalink
Post by Steve GS
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 '<Configure>':

----8<----

import tkinter as tk

def on_configure(*args):
print(args)

root = tk.Tk()
root.bind('<Configure>', on_configure)
root.mainloop()

----8<----

Are you placing the buttons yourself? I always use layouts and they
handle such things automatically.
Steve GS
2024-02-24 04:33:05 UTC
Permalink
How do I extract the values
from args?

SGA

-----Original Message-----
From: Python-list
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of MRAB via Python-list
Sent: Friday, February 23,
2024 9:27 PM
To: python-***@python.org
Subject: Re: Problem resizing
a window and button placement

On 2024-02-24 01:14, Steve GS
Post by Steve GS
Python, Tkinter: How do I
determine if a window has
been
Post by Steve GS
resized? I want to locate
buttons vertically along the
right border and need to
know
Post by Steve GS
the new width. The buttons
are
Post by Steve GS
to move with the change of
location of the right-side
border.
Bind an event handler for
'<Configure>':

----8<----

import tkinter as tk

def on_configure(*args):
print(args)

root = tk.Tk()
root.bind('<Configure>',
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
Barry
2024-02-24 08:04:18 UTC
Permalink
Post by Steve GS
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
Steve GS
2024-02-24 08:20:47 UTC
Permalink
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
<***@barrys-emacs.org>
Sent: Saturday, February 24,
2024 3:04 AM
To: Steve GS
<***@sga.ninja>
Cc: MRAB
<***@mrabarnett.plus.com>;
python-***@python.org
Subject: Re: Problem resizing
a window and button placement
On 24 Feb 2024, at 04:36,
Steve GS via Python-list
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
Stefan Ram
2024-02-24 09:56:11 UTC
Permalink
width
Using a geometry manager, such as "pack", you usually do not need
to know when a window has been resized or to know that width.

You need to read a good tkinter book and learn about:

tkinter.Tk
pack
tkinter.Frame
side=tkinter.LEFT
side=tkinter.RIGHT
expand=tkinter.YES
fill=tkinter.X
fill=tkinter.Y
fill=tkinter.BOTH

. I'd recommand the GUI part of "Programming Python" by Mark Lutz!

The geometry manages "pack" and "grid" should be able
to handle 99 percent of all GUI geometry requirements,
so you would need a good reason not to use them.
Thomas Passin
2024-02-24 13:39:55 UTC
Permalink
Post by Steve GS
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.
Post by Steve GS
So close......
SGA
-----Original Message-----
From: Barry
Sent: Saturday, February 24,
2024 3:04 AM
To: Steve GS
Cc: MRAB
Subject: Re: Problem resizing
a window and button placement
On 24 Feb 2024, at 04:36,
Steve GS via Python-list
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
Stefan Ram
2024-02-24 14:37:49 UTC
Permalink
Post by Thomas Passin
Well, yes, in Python a variable created inside a function or method is
local to that function unless you declare it global.
Or equivalent,

main.py

def f():
globals()[ 'x' ]= 2 # not a declaration!

f()

print( x )

_sys.stderr

2
Post by Thomas Passin
But if you think you need it to be a global variable you
should rethink your design.
"Global" variables in Python are actually just "module variable".
Module variables are not so bad. If you think of the module as a
singleton object it's kinda like a class.

But the usual recommendation is to use a class. I.e., transform

main.py

def write_global():
globals()[ 'x' ]= 2

def read_global():
print( globals()[ 'x' ])

write_global()
read_global()

_sys.stderr

2

into

class Object_:
def write_field( self ):
self.x = 2
def read_field( self ):
print( self.x )

object_ = Object_()
object_.write_field()
object_.read_field()

_sys.stderr

2
Post by Thomas Passin
For one thing, before the next time you use your global
variable the window size may have changed again.
The OP might be sleep walking into writing his own ad hoc,
informally-specified, bug-ridden, slow implementation of
half of a geometry manager like "pack" or "grid".
Grant Edwards
2024-02-24 03:28:27 UTC
Permalink
Post by MRAB
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.
----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
Steve GS
2024-02-25 00:33:52 UTC
Permalink
"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
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of Thomas Passin via
Python-list
Sent: Saturday, February 24,
2024 8:40 AM
To: python-***@python.org
Subject: Re: Problem resizing
a window and button placement

On 2/24/2024 3:20 AM, Steve GS
Post by Steve GS
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
Post by Steve GS
Vwidth = rootV.winfo_width()
and it also reports the
width
Post by Steve GS
as I resize the window.
However, I cannot seem to
use
Post by Steve GS
the variable Vwidth outside
the sub routine. It is
acting
Post by Steve GS
as if Vwidth is not global
but
Post by Steve GS
I added that. It is
reported
Post by Steve GS
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.
Post by Steve GS
So close......
SGA
-----Original Message-----
From: Barry
Sent: Saturday, February 24,
2024 3:04 AM
To: Steve GS
Cc: MRAB
Subject: Re: Problem
resizing
Post by Steve GS
a window and button
placement
Post by Steve GS
On 24 Feb 2024, at 04:36,
Steve GS via Python-list
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
Post by Steve GS
printed to learn what is in
the args.
Barry
--
https://mail.python.org/mailma
n/listinfo/python-list
MRAB
2024-02-25 00:49:16 UTC
Permalink
Post by Steve GS
"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.
Steve GS
2024-02-25 02:51:54 UTC
Permalink
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('<Configure>',
on_configure)
print("WwOutside = <" +
str(Ww) + ">")
#NameError: name 'Ww' is not
defined
root.mainloop()

SGA

-----Original Message-----
From: Python-list
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of MRAB via Python-list
Sent: Saturday, February 24,
2024 7:49 PM
To: python-***@python.org
Subject: Re: Problem resizing
a window and button placement

On 2024-02-25 00:33, Steve GS
Post by Steve GS
"Well, yes, in Python a
variable created inside a
function or method is local
to
Post by Steve GS
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,
Post by Steve GS
I can 'return' the variable
but that apparently would
not
Post by Steve GS
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
Thomas Passin
2024-02-25 03:38:36 UTC
Permalink
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.
Post by MRAB
import tkinter as tk
#global Ww Neither global
helps
# print(args)
#global Ww Neither
global helps
Ww = root.winfo_width()
print("WwInside = <" +
str(Ww) + ">")
root = tk.Tk()
root.bind('<Configure>',
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.
Post by MRAB
root.mainloop()
SGA
-----Original Message-----
From: Python-list
<python-list-bounces+gronicus=
Behalf Of MRAB via Python-list
Sent: Saturday, February 24,
2024 7:49 PM
Subject: Re: Problem resizing
a window and button placement
On 2024-02-25 00:33, Steve GS
Post by Steve GS
"Well, yes, in Python a
variable created inside a
function or method is local
to
Post by Steve GS
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,
Post by Steve GS
I can 'return' the variable
but that apparently would
not
Post by Steve GS
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.
MRAB
2024-02-25 03:36:04 UTC
Permalink
Post by MRAB
import tkinter as tk
#global Ww Neither global helps
# print(args)
#global Ww Neither global helps
Ww = root.winfo_width()
print("WwInside = <" + str(Ww) + ">")
root = tk.Tk()
root.bind('<Configure>', 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('<Configure>',on_configure)
root.mainloop()

----8<----
Steve GS
2024-02-25 03:53:40 UTC
Permalink
The print statement in the
function prints.
Does that not mean that the
function is being called?



SGA

-----Original Message-----
From: Python-list
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of Thomas Passin via
Python-list
Sent: Saturday, February 24,
2024 10:39 PM
To: python-***@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.
Post by MRAB
import tkinter as tk
#global Ww Neither global
helps
# print(args)
#global Ww Neither
global helps
Ww =
root.winfo_width()
Post by MRAB
print("WwInside = <" +
str(Ww) + ">")
root = tk.Tk()
root.bind('<Configure>',
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.
Post by MRAB
root.mainloop()
SGA
-----Original Message-----
From: Python-list
<python-list-bounces+gronicus=
Post by MRAB
Behalf Of MRAB via
Python-list
Post by MRAB
Sent: Saturday, February 24,
2024 7:49 PM
Subject: Re: Problem
resizing
Post by MRAB
a window and button
placement
Post by MRAB
On 2024-02-25 00:33, Steve
GS
Post by MRAB
Post by Steve GS
"Well, yes, in Python a
variable created inside a
function or method is local
to
Post by Steve GS
that function unless you
declare it global."
Yes, I knew that. I tried
to
Post by MRAB
Post by Steve GS
global it both before the
function call and within
it.
Post by MRAB
Post by Steve GS
Same for when I created the
variable. If I try to use
it
Post by MRAB
Post by Steve GS
in the rest of the code, it
keeps coming up as not
declared. In other
functions,
Post by Steve GS
I can 'return' the variable
but that apparently would
not
Post by Steve GS
work for this function.
Is this type of function
any
Post by MRAB
Post by Steve GS
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
Steve GS
2024-02-25 03:58:00 UTC
Permalink
So, how do I use the width value in my code?

SGA

-----Original Message-----
From: Python-list <python-list-bounces+gronicus=***@python.org> On Behalf Of MRAB via Python-list
Sent: Saturday, February 24, 2024 10:36 PM
To: python-***@python.org
Subject: Re: Problem resizing a window and button placement
Post by MRAB
import tkinter as tk
#global Ww Neither global helps
# print(args)
#global Ww Neither global helps
Ww = root.winfo_width()
print("WwInside = <" + str(Ww) + ">")
root = tk.Tk()
root.bind('<Configure>', 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('<Configure>',on_configure)
root.mainloop()

----8<----

--
https://mail.python.org/mailman/listinfo/python-list
Alan Gauld
2024-02-25 17:44:05 UTC
Permalink
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('<Configure>', 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
Steve GS
2024-02-25 21:19:57 UTC
Permalink
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 <module>
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 <***@gmail.com>
Sent: Sunday, February 25, 2024 12:44 PM
To: Steve GS <***@SGA.Ninja>; python-***@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('<Configure>', 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
Thomas Passin
2024-02-25 22:55:12 UTC
Permalink
Post by Steve GS
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"
Post by Steve GS
Mischief Managed.
========================
File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in <module>
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-----
Sent: Sunday, February 25, 2024 12:44 PM
Subject: Re: RE: Problem resizing a window and button placement
import tkinter as tk
Ww = None
global Ww
Ww = root.winfo_width()
print("Ww Inside = <" + str(Ww) + ">")
root = tk.Tk()
root.bind('<Configure>', on_configure)
root.mainloop()
print("Ww Outside = <" + str(Ww) > + ">")
Ww Inside = <200>
Ww Inside = <200>
Ww Inside = <205>
Ww Inside = <205>
Ww Inside = <206>
Ww Inside = <206>
Ww Outside = <206>
HTH
MRAB
2024-02-25 23:40:20 UTC
Permalink
Post by Steve GS
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.
========================
File "F:/___zInsulin Code A 08-02-23/WinPic/IOWw.pyw", line 14, in <module>
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) + ">")
Post by Steve GS
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]
Steve GS
2024-02-26 07:56:35 UTC
Permalink
Ww Inside = <250>
Ww Inside = <249>
Ww Inside = <250>
Ww Outside =
<1770662408256on_configure>

Here is my result...

SGA

-----Original Message-----
From: Python-list
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of MRAB via Python-list
Sent: Sunday, February 25,
2024 6:40 PM
To: python-***@python.org
Subject: Re: Problem resizing
a window and button placement

On 2024-02-25 21:19, Steve GS
Post by Steve GS
SOLUTION FOUND!
The fix was to write the
code that uses the width value
and to place it into the
function itself.
Post by Steve GS
Kluge? Maybe but it works.
Mischief Managed.
========================
As for the most recent
Traceback (most recent call
File "F:/___zInsulin Code
A 08-02-23/WinPic/IOWw.pyw",
line 14, in <module>
Post by Steve GS
print("Ww Outside = <"
+ str(Ww) > + ">")
Post by Steve GS
TypeError: bad operand type
for unary +: 'str'
It fails because there's a
mistake. It should be:

print("Ww Outside = <" +
str(Ww) + ">")
Post by Steve GS
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.
Post by Steve GS
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
Steve GS
2024-02-26 07:56:35 UTC
Permalink
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
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of Thomas Passin via
Python-list
Sent: Sunday, February 25,
2024 5:55 PM
To: python-***@python.org
Subject: Re: Problem resizing
a window and button placement

On 2/25/2024 4:19 PM, Steve GS
Post by Steve GS
SOLUTION FOUND!
The fix was to write the
code that uses the width value
and to place it into the
function itself.
Post by Steve GS
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"
Post by Steve GS
Mischief Managed.
========================
As for the most recent
Traceback (most recent call
File "F:/___zInsulin Code
A 08-02-23/WinPic/IOWw.pyw",
line 14, in <module>
Post by Steve GS
print("Ww Outside = <"
+ str(Ww) > + ">")
Post by Steve GS
TypeError: bad operand type
for unary +: 'str'
Post by Steve GS
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.
Post by Steve GS
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.
Post by Steve GS
SGA
-----Original Message-----
From: Alan Gauld
Sent: Sunday, February 25,
2024 12:44 PM
Post by Steve GS
To: Steve GS
Subject: Re: RE: Problem
resizing a window and button
placement
Post by Steve GS
On 25/02/2024 03:58, Steve
import tkinter as tk
Ww = None
global Ww
Ww =
root.winfo_width()
Post by Steve GS
print("Ww Inside =
<" + str(Ww) + ">")
Post by Steve GS
root = tk.Tk()
root.bind('<Configure>',
on_configure)
Post by Steve GS
root.mainloop()
print("Ww Outside = <" +
str(Ww) > + ">")
Post by Steve GS
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
Alan Gauld
2024-02-26 09:03:57 UTC
Permalink
Post by Steve GS
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.
Post by Steve GS
Post by MRAB
import tkinter as tk
Ww = None
global Ww
Ww = root.winfo_width()
print("Ww Inside =<"+str(Ww)+">")
root = tk.Tk()
root.bind('<Configure>',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
Steve GS
2024-02-26 11:02:59 UTC
Permalink
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('<Configure>',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 <***@gmail.com>
Sent: Monday, February 26, 2024 4:04 AM
To: Steve GS <***@SGA.Ninja>; python-***@python.org
Subject: Re: RE: Problem resizing a window and button placement
Post by Steve GS
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.
Post by Steve GS
Post by MRAB
import tkinter as tk
Ww = None
global Ww
Ww = root.winfo_width()
print("Ww Inside =<"+str(Ww)+">")
root = tk.Tk()
root.bind('<Configure>',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
Alan Gauld
2024-02-26 12:04:26 UTC
Permalink
Post by Steve GS
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('<Configure>', 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
Thomas Passin
2024-02-26 13:34:19 UTC
Permalink
Post by Steve GS
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.
Post by Steve GS
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.
Post by Steve GS
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('<Configure>',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-----
Sent: Monday, February 26, 2024 4:04 AM
Subject: Re: RE: Problem resizing a window and button placement
Post by Steve GS
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.
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.
Post by Steve GS
Post by MRAB
import tkinter as tk
Ww = None
global Ww
Ww = root.winfo_width()
print("Ww Inside =<"+str(Ww)+">")
root = tk.Tk()
root.bind('<Configure>',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
http://www.flickr.com/photos/alangauldphotos
Steve GS
2024-02-27 07:13:19 UTC
Permalink
Post by Steve GS
Post by Thomas Passin
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....
Post by Steve GS
Post by Thomas Passin
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.
Post by Steve GS
Post by Thomas Passin
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
<python-list-bounces+gronicus=
***@python.org> On
Behalf Of Thomas Passin via
Python-list
Sent: Monday, February 26,
2024 8:34 AM
To: python-***@python.org
Subject: Re: Problem resizing
a window and button placement

On 2/26/2024 6:02 AM, Steve GS
Post by Steve GS
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.
Post by Steve GS
import tkinter as tk
Ww = None # What does this
do? Why not Integer?
Post by Steve GS
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.
Post by Steve GS
global Ww
global WwZ
Ww =
root.winfo_width()
Post by Steve GS
print("9 Ww Inside
=<"+str(Ww)+">") # works
Post by Steve GS
WwZ = Ww * 2
print("11 WwZ
Inside =<"+str(WwZ)+">") #
works
Post by Steve GS
return(Ww) #Can I
use this?
Post by Steve GS
root = tk.Tk()
root.bind('<Configure>',on_con
figure)
Post by Steve GS
print("15 Ww Inside1 =
<"+str(Ww)+">")
Post by Steve GS
#Ww2 = int(Ww) * 2 # fails
print("17 WwZ Inside2 =
<"+str(WwZ)+">")
Post by Steve GS
root.mainloop()
Ww2 = int(Ww) * 2 #Works
but only after the program
stops
Post by Steve GS
print("21 Ww Outside2 =
<"+str(WwZ)+">") # Can I have
concentric
Post by Steve GS
loops?
SGA
-----Original Message-----
From: Alan Gauld
Sent: Monday, February 26,
2024 4:04 AM
Post by Steve GS
To: Steve GS
Subject: Re: RE: Problem
resizing a window and button
placement
Post by Steve GS
On 26/02/2024 07:56, Steve
Post by Thomas Passin
Then there is that
discovery
Post by Steve GS
Post by Thomas Passin
element: Why is my original
idea not working? I still
cannot pass the value back
from the function. What is
different about this
function
Post by Steve GS
Post by Thomas Passin
that others would have
given
Post by Steve GS
Post by Thomas Passin
me the value?
There is nothing different,
see the code below.
Post by Steve GS
print() is a function like
any other.
Post by Steve GS
In this case it is called
after you close the window, ie
after mainloop() exits.
Post by Steve GS
But any other function
called inside
Post by Steve GS
mainloop - eg any other
event handler can also access
it.
Post by Steve GS
For example, if you added a
def printW(): print("Button
Ww = ", Ww)
Post by Steve GS
bw = tk.Button(root,
text="Print Width",
command=printW)
Post by Steve GS
bw.pack()
You would be able to print
the value on demand.
Post by Steve GS
Post by Thomas Passin
Post by MRAB
import tkinter as tk
Ww = None
global Ww
Ww =
root.winfo_width()
Post by Steve GS
Post by Thomas Passin
Post by MRAB
print("Ww Inside
=<"+str(Ww)+">")
Post by Steve GS
Post by Thomas Passin
Post by MRAB
root = tk.Tk()
root.bind('<Configure>',on_con
figure)
Post by Steve GS
Post by Thomas Passin
Post by MRAB
root.mainloop()
print("Ww Outside =
<"+str(Ww)+">")
Post by Steve GS
--
Alan G
Author of the Learn to
Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/a
lan_gauld
Post by Steve GS
Follow my photo-blog on
Flickr at:
http://www.flickr.com/photos/a
langauldphotos
--
https://mail.python.org/mailma
n/listinfo/python-list
Alan Gauld
2024-02-27 12:15:14 UTC
Permalink
Post by Steve GS
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()
Post by Steve GS
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).
Post by Steve GS
Post by Thomas Passin
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
Steve GS
2024-02-28 08:01:21 UTC
Permalink
My window is to have a label
over an image. How do I place
a label that has a transparent
background so as to not have
the square of the label look
so obnoxious?

SGA
Stefan Ram
2024-02-28 11:10:01 UTC
Permalink
Post by Steve GS
a label that has a transparent
background
This may not be so easy. Perhaps you use a canvas and then
place images and texts in this canvas with "create_image"
and "create_text".

Loading...