Transparent label background?
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 -- 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
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: 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
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: 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: 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
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
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
"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
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
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
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: IDLE editor suggestion.
Does anything from the Visual Studio family of software have a pull down menu that lists previous searches so that I don’t have to enter them every time? SGA -Original Message- From: Friedrich Romstedt Sent: Tuesday, December 12, 2023 12:52 PM To: Steve GS Cc: python-list@python.org Subject: Re: IDLE editor suggestion. Hi! Am Di., 12. Dez. 2023 um 09:28 Uhr schrieb Steve GS via Python-list : > > Maybe this already exists but > I have never seen it in any > editor that I have used. You might want to choose Microsoft Code from its Visual Studio family of software, or, if you're ready for a deep dive, you might try using vim. Personally I am using both. HTH, Friedrich -- https://mail.python.org/mailman/listinfo/python-list
IDLE editor suggestion.
Maybe this already exists but I have never seen it in any editor that I have used. It would be nice to have a pull-down text box that lists all of the searches I have used during this session. It would make editing a lot easier if I could select the previous searches rather than having to enter it every time. If this is inappropriate to post this here, please tell me where to go. Life should be so complicated. -- https://mail.python.org/mailman/listinfo/python-list
RE: A problem with str VS int.
With all these suggestions on how to fix it, no one seems to answer why it fails only when entering a two-digit number. One and three work fine when comparing with str values. It is interesting that the leading 0 on a two digit worked. Still, one digit and three digit work but not two. This is now more of a curiosity as I did use the integer comparisons. SGA -Original Message- From: Python-list On Behalf Of dn via Python-list Sent: Sunday, December 10, 2023 12:53 AM To: python-list@python.org Subject: Re: A problem with str VS int. On 10/12/23 15:42, Steve GS via Python-list wrote: > If I enter a one-digit input or a three-digit number, the code works but if I enter a two digit number, the if statement fails and the else condition prevails. > > tsReading = input(" Enter the " + Brand + " test strip reading: ") > if tsReading == "": tsReading = "0" > print(tsReading) > if ((tsReading < "400") and (tsReading >= "0")): > tsDose = GetDose(sReading) > print(tsReading + "-" + tsDose) > ValueFailed = False > else: > print("Enter valid sensor test strip Reading.") > > I converted the variable to int along with the if statement comparison and it works as expected. > See if it fails for you... It works as expected (by Python)! This is how strings are compared - which is not the same as the apparently-equivalent numeric comparison. Think about what you expect from the code below, and then take it for a spin (of mental agility): values = [ 333, 33, 3, 222, 22, 2, 111, 11, 1, ] print( sorted( values ) ) strings = [ "333", "33", "3", "222", "22", "2", "111", "11", "1", ] print( sorted( strings ) ) The application's data appears numeric (GetDose() decides!). Accordingly, treat it so by wrapping int() or float() within a try-except (and adjusting thereafter...). "But wait, there's more!" (assuming implement as-above): if 0 <= ts_reading < 400: 1 consistent 'direction' of the comparisons = readability 2 able to "chain" the comparisons = convenience 3 identifier is PEP-008-compliant = quality and style -- Regards, =dn -- https://mail.python.org/mailma n/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
A problem with str VS int.
If I enter a one-digit input or a three-digit number, the code works but if I enter a two digit number, the if statement fails and the else condition prevails. tsReading = input(" Enter the " + Brand + " test strip reading: ") if tsReading == "": tsReading = "0" print(tsReading) if ((tsReading < "400") and (tsReading >= "0")): tsDose = GetDose(sReading) print(tsReading + "-" + tsDose) ValueFailed = False else: print("Enter valid sensor test strip Reading.") I converted the variable to int along with the if statement comparison and it works as expected. See if it fails for you... Steve -- https://mail.python.org/mailman/listinfo/python-list
Subtracting dates to get hours and minutes
How do I subtract two time/dates and calculate the hours and minutes between? Steve -- https://mail.python.org/mailman/listinfo/python-list
RE: Automatic Gain Control in Python?
Yes, it is real-time play back of a pre-recorded presentation. A juke box does the same thing. It plays records. You didn't put your quarter in to expect the band to play your piece live, did you? Same here, I am pulling in the programs and playing them for an audience. All I want to do is have some semblance of AGC audio since the sources don't seem to be able to do it. " I would strongly > recommend going for the much much easier method of simply downloading > the files as they are." As Bill Gates would say "You have not understood it from the start." No, downloading the files, all 48 of them every week, is not easier if I have to turn around and replay them through the system. What could be easier than to have the smart speaker do all that work and play the podcasts "live". All I want to do is jump in there between the Smart Speaker and the input to the intercom and twerk the audio a bit. Footnote: If you double major in psychology and reverse psychology, to they cancel each other out? -Original Message- From: Python-list On Behalf Of Phil Boutros Sent: Monday, June 6, 2022 12:39 PM To: python-list@python.org Subject: Re: Automatic Gain Control in Python? Chris Angelico wrote: > > General principle: If you're asking someone else for help, don't tell > them that your way is easier, because the obvious response is "go > ahead then, do it your own way". *Ding Ding Ding*...We have a winner! At least, that's where I dropped off. My experienced advice is all wrong for you? Sorry I couldn't help more. Good luck to you. > You're technically right in a sense: something that you already have > is, indeed, easier than something else. But downloading files is > *easy* in Python, and audio analysis on files is FAR easier than > real-time audio analysis with hysteresis avoidance. Also this. > Unless you have a really good > reason for sticking to the black-box system, I would strongly > recommend going for the much much easier method of simply downloading > the files as they are. As pretty much everyone else has said. Insisting on real-time processing of something that is itself pre-recorded is non-sensical. Phil -- AH#61 Wolf#14 BS#89 bus#1 CCB#1 SENS KOTC#4 ph...@philb.ca http://philb.ca -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
RE: Automatic Gain Control in Python?
I started but major issues prevented me this weekend (New Roof, Major limb broke for pine tree... I still have to install pyAudio. Genie: You have three wishes. Me: I wish I had more wishes. Genie: You cannot wish for more wishes. Me: I wish I could. -Original Message- From: Python-list On Behalf Of MRAB Sent: Tuesday, May 31, 2022 9:47 PM To: python-list@python.org Subject: Re: Automatic Gain Control in Python? On 2022-06-01 02:03, Steve GS wrote: [snip] > Maybe you do not understand smart speakers. That is exactly what they do. > You tell them what podcast/broadcast to play, they get it and play it > for you. It is that simple. > > All I want to do is change the audio levels automatically to make it > easier on the ear. > Did you have a look at the code I posted? I've found that pyaudio can listen to the Line In input at the same time as Audacity is recording from it, so you could might be able to use it to monitor the level and then tell the smart speaker to turn the volume up or down. -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
RE: Automatic Gain Control in Python?
>Even easier, the few NPR podcasts I just checked now have RSS feeds of their episodes (as expected). It seems it would be much easier to just download the latest episode based on the XML file, normalize, send it to play, done. How can that possibly be easier? I am playing the podcast and recording it for a one-time replay. Now you want me to write a program that automatically downloads 48 files then manipulate them for equalization then replay it. It certainly doesn't sound easier to me. I already have that working using simple computer-generated vocal commands. > Why is it so crucial that it be done "in real time", which it really isn't, unless you are listening to the live NPR feed. In the case of podcasts, *why* would you possible play them via streaming instead of downloading the publicly accessible file to manipulate however you chose? It is played "real time" and yes, for the listeners in the community, it is real time no matter when it was recorded. >> The code is to: Listen to the audio level for about 10 seconds or so >> and raise or lower the level in small increments. >Based on what? A simple sample rate. > Do you want a 10 second buffer to continually be analyzed in real time? >From the output of a speaker, no less? Why should the source be of any concern? It is much more than a speaker. It is pulling in the podcasts/broadcasts and playing them. The audio is also being sent to a computer through an aux-out cable. Why is that confusing? > And which level? Peak? Average over...10 seconds? Are you keeping track of the previous values to make it match? That is what correlation is all about. >Where is that stored? In the computer that is running the AGC. >> It has nothing to do with understanding how to grab podcasts. The >> system is working very well for that. OK...then perhaps I/we am/are confused on the limitations of the program. What does it "grab", *exactly*? Maybe you do not understand smart speakers. That is exactly what they do. You tell them what podcast/broadcast to play, they get it and play it for you. It is that simple. All I want to do is change the audio levels automatically to make it easier on the ear. -- AH#61 Wolf#14 BS#89 bus#1 CCB#1 SENS KOTC#4 ph...@philb.ca http://philb.ca -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
RE: Automatic Gain Control in Python?
No, not a digital file. I am playing the podcast/broadcast live to the community using a separate network of smart speakers (Amazon Echo). Commands are being sent hourly through a speaker to the SS from an excel program. I want to monitor the audio level between the line-out of the SS and the input to another computer which then records the audio using Audacity for a single replay during the week. I think my first post should have started “Fasten your seat belts, it is going to be a bumpy night…) Genie: You have three wishes. Me: I wish I had more wishes. Genie: You cannot wish for more wishes. Me: I wish I could. From: Benjamin Schollnick Sent: Sunday, May 29, 2022 11:18 AM To: Steve GS Cc: Richard Damon ; Python Subject: Re: Automatic Gain Control in Python? Okay, you are capturing the audio stream as a digital file somewhere, correct? Why not just right a 3rd party package to normalize the audio levels in the digital file? It’ll be faster, and probably easier than trying to do it in real time… eg. https://campus.datacamp.com/courses/spoken-language-processing-in-python/manipulating-audio-files-with-pydub?ex=8 Normalizing an audio file with PyDub Sometimes you'll have audio files where the speech is loud in some portions and quiet in others. Having this variance in volume can hinder transcription. Luckily, PyDub's effects module has a function called normalize() which finds the maximum volume of an AudioSegment, then adjusts the rest of the AudioSegment to be in proportion. This means the quiet parts will get a volume boost. You can listen to an example of an audio file which starts as loud then goes quiet, loud_then_quiet.wav, <https://assets.datacamp.com/production/repositories/4637/datasets/9251c751d3efccf781f3e189d68b37c8d22be9ca/ex3_datacamp_loud_then_quiet.wav> here. In this exercise, you'll use normalize() to normalize the volume of our file, making it sound <https://assets.datacamp.com/production/repositories/4637/datasets/f0c1ba35ff99f07df8cfeee810c7b12118d9cd0f/ex3_datamcamp_normalized_loud_quiet.wav> more like this. or https://stackoverflow.com/questions/57925304/how-to-normalize-a-raw-audio-file-with-python - Benjamin On May 29, 2022, at 11:04 AM, Steve GS mailto:Gronicus@SGA.Ninja> > wrote: From your description, your fundamental problem is you are trying to automatically "control" things that weren't designed to be automatically controlled in the way you are attempting. How so? I am sending commands to a smart speaker and it plays podcasts and broadcasts. How is this a violation of SS design? === The smart speaker assumes the "user" will adjust the volume either with the controls or with verbal commands, So things will be a bit "clunky" in your results as you command the smart speaker volume level. So, you want me to sit here for every hour of the weekend and monitor the audio levels for a result that will get, at best, one replay when I believe it can be automated. === Yes, you have an automated system that does most of what you want, but it is based on pieces not designed to be automated in this way, and you are running into the limitations caused by that. Again, what limitations of the SS am I violating? It is designed to receive commands and play the audio. Also, what makes you think that you know how my program is based? === Yes, you could split the aux-out to bring it into another computer to listen to the sound level, and then using a sound input package get samples of what is playing, and analyze that data to get an average volume, and then issues the command to adjust the volume level. Hmmm, is that not my original question? Are you suggesting to monitor the audio, sense it for volume changes and apply those changes to the original audio? One thing that may have to happen is a timed-delay to all for the AGC to work. This may require a correlation circuit. == What you seem to be missing is that you could get the podcasts from a browser, and all a browser is is a program. It isn't that much work to write a rudimentary browser in python, especially if you don't actually need to display the results to a user, but are only trying to automate a particular task. Writing my own browser in Python might work. Do you have a sample one that I could twerk to fit my needs? I would have to be able to invoke it and an hour later devoke it least I end up with multiple audio channels playing. Either way, I would still need an AGC program which was my original question. === You seem to feel strongly invested in your current code base, which is understandable, but it seems you have reached a point where you don't want to live with the limitations CAUSED by that system. The changes in volume are not CAUSED by my pro
RE: Automatic Gain Control in Python?
tion to download and play a podcast or broadcast is legal only for live replay. My want to record them for one replay for my own use. Personal play is a different story. -Original Message- From: Richard Damon On Behalf Of Richard Damon Sent: Sunday, May 29, 2022 8:03 AM To: Steve GS ; Python Subject: Re: Automatic Gain Control in Python? From your description, your fundamental problem is you are trying to automatically "control" things that weren't designed to be automatically controlled in the way you are attempting. The smart speaker assumes the "user" will adjust the volume either with the controls or with verbal commands, So things will be a bit "clunky" in your results as you command the smart speaker volume level. Yes, you have an automated system that does most of what you want, but it is based on pieces not designed to be automated in this way, and you are running into the limitations caused by that. Yes, you could split the aux-out to bring it into another computer to listen to the sound level, and then using a sound input package get samples of what is playing, and analyze that data to get an average volume, and then issues the command to adjust the volume level. What you seem to be missing is that you could get the podcasts from a browser, and all a browser is is a program. It isn't that much work to write a rudimentary browser in python, especially if you don't actually need to display the results to a user, but are only trying to automate a particular task. You seem to feel strongly invested in your current code base, which is understandable, but it seems you have reached a point where you don't want to live with the limitations CAUSED by that system. Yes, there is likely a way to tack on another layer of "stuff" to adjust for this issue, but it likely is going to require some real programming. It may well be the design I am suggesting, of writing a program to fetch the podcast and save it requires a bit more work to get to the level you currently are at, but the results are a system that is actually designed to be controlled by automation. Maybe it is beyond you ability, but then so might the programming to get the volume. I will also add, that the way your describe going to your "community" gives me questions if this is a violation of copyright. Maybe it is something you can "Get away with", but I am not sure what you are doing is actually legitimate. On 5/29/22 1:09 AM, Steve GS wrote: > You really need to understand what I am trying to do. > It is not a simple lesson in use of podcasts. > This is an automated system. I call it my NPR Jukebox. > > 15 years ago, I started with hourly URL calls to a browser to record specific > NPR programs. It took a lot of coordination. I had to use IE because I needed > to start and stop browsers on the hour and IE was the only one that could do > that. Then web sites started "upgrading" to Edge. Through some trickery I was > able to get Edge to do what IE did but it was unstable. > > I then discovered the Echo Smart Speaker. I set my program to announce the > broadcast station or podcast by speaker to the smart speaker and it cured a > lot of headaches. I then was able to call podcasts because the Echo handles > them through TuneIn. Unfortunately, not all broadcasts ae available as > podcasts. > > I am not here diddling around just playing podcasts. Let me repeat > what I have already said. It is an automated system. Every hour for > 48 hours on every weekend, my system using a well-developed Excel/VBA > program that vocally talks to the SS hourly. The SS finds the audio > and sends it to my Audacity recorder on another computer through > aux-out to mic-in cable. The selections of audio are also transmitted > to the community at the time of recording > > That part of the system is almost flawless, well compared to that I had > before. Although the quality, tone, and timing of the announcement, the SS > still gets confused once in a while and goes silent for the hour. I need to > detect this too. > > Ok, now back to the original question. > > Podcasts and broadcasts apparently do not use the Dolby tone to balance the > audio levels. And I receive highly fluctuating levels of audio. Sometimes it > is between sides of a conversation, sometimes it is the podcast vs station > identifications, then it is great differences between one web site and > another. Then there's the differences with male and female voices. Imagine > that you are watching TV late night then the commercials COME IN AT FULL > BLAST. > > The technology of the industry grew up with male voices and apparently sees > no reason to adjust for female. I have worked with audio systems and making > recordings for more years that I
RE: Automatic Gain Control in Python?
You really need to understand what I am trying to do. It is not a simple lesson in use of podcasts. This is an automated system. I call it my NPR Jukebox. 15 years ago, I started with hourly URL calls to a browser to record specific NPR programs. It took a lot of coordination. I had to use IE because I needed to start and stop browsers on the hour and IE was the only one that could do that. Then web sites started "upgrading" to Edge. Through some trickery I was able to get Edge to do what IE did but it was unstable. I then discovered the Echo Smart Speaker. I set my program to announce the broadcast station or podcast by speaker to the smart speaker and it cured a lot of headaches. I then was able to call podcasts because the Echo handles them through TuneIn. Unfortunately, not all broadcasts ae available as podcasts. I am not here diddling around just playing podcasts. Let me repeat what I have already said. It is an automated system. Every hour for 48 hours on every weekend, my system using a well-developed Excel/VBA program that vocally talks to the SS hourly. The SS finds the audio and sends it to my Audacity recorder on another computer through aux-out to mic-in cable. The selections of audio are also transmitted to the community at the time of recording That part of the system is almost flawless, well compared to that I had before. Although the quality, tone, and timing of the announcement, the SS still gets confused once in a while and goes silent for the hour. I need to detect this too. Ok, now back to the original question. Podcasts and broadcasts apparently do not use the Dolby tone to balance the audio levels. And I receive highly fluctuating levels of audio. Sometimes it is between sides of a conversation, sometimes it is the podcast vs station identifications, then it is great differences between one web site and another. Then there's the differences with male and female voices. Imagine that you are watching TV late night then the commercials COME IN AT FULL BLAST. The technology of the industry grew up with male voices and apparently sees no reason to adjust for female. I have worked with audio systems and making recordings for more years that I want to admit. All I want is software to detect level changes over time and attempt to equalize them. It has to be work between the SS and the recorder and is to be checking all the time. The code is to: Listen to the audio level for about 10 seconds or so and raise or lower the level in small increments. It has nothing to do with understanding how to grab podcasts. The system is working very well for that. Footnote: “What rhymes with orange?” “No, it doesn’t..” -Original Message- From: Richard Damon On Behalf Of Richard Damon Sent: Saturday, May 28, 2022 11:37 PM To: Steve GS Subject: Re: Automatic Gain Control in Python? On 5/28/22 8:17 PM, Steve GS wrote: > "My first thought is you are solving the wrong problem. What seems a > better option would be to get your code to actually connect up to the > podcast and just download the audio directly, rather than trying to > get the smart speaker to play the audio and record it with a microphone." > > The smart-speaker is bringing in the podcast by hourly automated > commands and sending by audio cable to a computer which is recording > it with Audacity. This is an automated system that runs for 48 hours every > weekend. > Its output is played live throughout the facility and is also recorded > for replay through the week. > > No download to use. > > AGC is to happen when the Smart Speaker is playing it, real time. > Any post-record editing would be a horrendous task to say the least. > My guess is you don't understand how "Podcasts" work. All they are is a web resource that your Browser/Smart Device makes a request off, and the contents are streamed over the internet to that device, which then plays it. Smart Speakers just have a program that knows how to access these. Since they can be listened to on a web browser, a program can download the data. They might be doing things to make this harder, but that is a sign that you shouldn't be doing this in the first place. Often, the data format that is streamed is exactly like the file format for storing an audio file (since that is what the code in the browser is built to handle). It may be a bit of work to figure out the access methods to get the data, but this is the sort of job that computers were designed to do. Trying to make things that weren't designed to be remote controlled to be remote controlled may well be a lot more work. -- Richard Damon -- https://mail.python.org/mailman/listinfo/python-list
RE: Automatic Gain Control in Python?
>> Why would post-record editing be "horrendous"? This has to be done on-the-fly before it is recorded. After the AGC is applied, it will be played, live, to the community. It is played during the week to a much smaller audience, almost as background noise. Post recording editing would be a waste of time and worthless. >> Does it record the whole 48 hours into 1 file? Two files, 24 hours each, one for Saturday, the other Sunday -Original Message- From: Python-list On Behalf Of MRAB Sent: Saturday, May 28, 2022 8:57 PM To: python-list@python.org Subject: Re: Automatic Gain Control in Python? On 2022-05-29 01:17, Steve GS wrote: > "My first thought is you are solving the wrong problem. What seems a > better option would be to get your code to actually connect up to the > podcast and just download the audio directly, rather than trying to > get the smart speaker to play the audio and record it with a microphone." > > The smart-speaker is bringing in the podcast by hourly automated > commands and sending by audio cable to a computer which is recording > it with Audacity. This is an automated system that runs for 48 hours every weekend. > Its output is played live throughout the facility and is also recorded > for replay through the week. > > No download to use. > > AGC is to happen when the Smart Speaker is playing it, real time. > Any post-record editing would be a horrendous task to say the least. > [snip] Why would post-record editing be "horrendous"? Does it record the whole 48 hours into 1 file? If it's recording each podcast separately, it could process each one after recording it, even while the next one is being recorded, and I really doubt that processing each one while take long. -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
RE: Automatic Gain Control in Python?
"My first thought is you are solving the wrong problem. What seems a better option would be to get your code to actually connect up to the podcast and just download the audio directly, rather than trying to get the smart speaker to play the audio and record it with a microphone." The smart-speaker is bringing in the podcast by hourly automated commands and sending by audio cable to a computer which is recording it with Audacity. This is an automated system that runs for 48 hours every weekend. Its output is played live throughout the facility and is also recorded for replay through the week. No download to use. AGC is to happen when the Smart Speaker is playing it, real time. Any post-record editing would be a horrendous task to say the least. = Genie: You have three wishes. Me: I wish I had more wishes. Genie: You cannot wish for more wishes. Me: I wish I could. -Original Message- From: Python-list On Behalf Of Richard Damon Sent: Saturday, May 28, 2022 6:53 PM To: python-list@python.org Subject: Re: Automatic Gain Control in Python? On 5/28/22 5:29 PM, Steve GS wrote: > I have an extensive Excel/VBA program that hourly calls and plays > podcasts through a "smart" speaker. The output of the speaker feeds > into another computer that records the m\audio using Audacity. > > It has become obvious that NPR does not regulate volumes for podcasts > and broadcasts nor are programs in themselves regulated by volume. > Audacity does not have an AGC. > > It has also been noted that Excel/VBA code cannot see the audio being > played on the same computer. > > I would like to find code that will regulate the volume and give some > semblance of control/moderation. Also, sometimes the Smart Speaker > fails to play the program and I get an hour of silence before the next > command to play happens. The code should detect that nothing is > playing and send the command to the smart speaker again. > > Is there any Python code that I might be able to call from VBA that > will monitor and regulate the volume of the audio? A few samples of > code that can read/modify the audio will help me develop the final product. > > Suggestions appreciated. My first thought is you are solving the wrong problem. What seems a better option would be to get your code to actually connect up to the podcast and just download the audio directly, rather than trying to get the smart speaker to play the audio and record it with a microphone. That might require finding the API for the site that hosts the podcasts, to get it to send the files to you to "play". Once you have the files, it becomes simple signal processing to go over the files and AGCing them as needed. On a side note, make sure you are within your rights within Copyright law for what you are doing. Recording for PERSONAL use is probably within the bounds of "Fair Use", but the material is surely under Copyright, so be careful what you do with it. -- Richard Damon -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Automatic Gain Control in Python?
I have an extensive Excel/VBA program that hourly calls and plays podcasts through a "smart" speaker. The output of the speaker feeds into another computer that records the m\audio using Audacity. It has become obvious that NPR does not regulate volumes for podcasts and broadcasts nor are programs in themselves regulated by volume. Audacity does not have an AGC. It has also been noted that Excel/VBA code cannot see the audio being played on the same computer. I would like to find code that will regulate the volume and give some semblance of control/moderation. Also, sometimes the Smart Speaker fails to play the program and I get an hour of silence before the next command to play happens. The code should detect that nothing is playing and send the command to the smart speaker again. Is there any Python code that I might be able to call from VBA that will monitor and regulate the volume of the audio? A few samples of code that can read/modify the audio will help me develop the final product. Suggestions appreciated. -- https://mail.python.org/mailman/listinfo/python-list