I am using a Mac mini M1 with OS Sonoma and Python 3.12 with PySimpleGUI 5 and am coding a simple Lottery number generator.
When Run, the code below shows the window on the screen exactly as expected. However, when I click on a Radio button, nothing happens. Also when I click on Exit, nothing happens. To (inexperienced) me, it looks like a problem with the Event action and the “while True” statement.
Here is the window on the screen:
Here is the code:
import PySimpleGUI as sg
from tkinter import messagebox
import random
sg.set_options(font='Helvetica 14')
global lottery, choiceList
lottery = " "
choicelist = []
def main():
layout = [ [sg.Text("Choose a lottery")],
[sg.Radio('Lotto', group_id=1, enable_events=True, key='-LOTTO-')],
[sg.Radio('Euro Millions', group_id=1, enable_events=True, key='-EURO-')],
[sg.Button('Exit', key='-EXIT-')]
]
window = sg.Window("Lottery Number Generator", layout)
sg.main_sdk_help()
while True: # Event Loop
event, values = window.read()
print(event, values)
if event == sg.WIN_CLOSED or event == 'Exit':
break
elif event == sg.Radio('Lotto', 1):
lottery = "Lotto"
print(f"contents of L lottery var is {lottery}")
# create an empty List variable to hold the 6 numbers
choiceList = []
for i in range(6):
choiceLotto = [(random.randint(1, 59))]
choiceList.append(choiceLotto)
choiceList.sort()
print(f"contents of Lotto choiceList is {choicelist}")
sg.popup("Here are your Lotto numbers ", choiceList)
elif event == sg.Radio('Euro Millions', 1):
lottery = ('Euro Millions')
print("E lottery = ", lottery)
choiceEuro = []
for i in range(5):
choiceEuro = [(random.randint(1, 50))]
choiceList.append[choiceEuro]
choiceList.sort()
print("contents of Euro choiceList is ", choiceList)
for i in range(2):
choiceEuro = [(random.randint(1, 12))]
choiceList.append(choiceEuro)
sg.popup("Here are your Euro Millions Lottery numbers ", choiceList)
window.close()
if __name__ == '__main__':
main()
I guess it’s waiting here for you to close the help window (maybe it’s offscreen or otherwise hidden), so the while loop never enters the picture.
This window.close() is inside the while True: loop, and there’s no condition guarding it. So if you did get into this loop, I would expect it to exit immediately the first time, after handling the first event (which is probably not any of the ones your program is interested in).
I strongly recommend that you choose a consistent indentation pattern so that you can more easily see the structure of the code, and use functions to break the code up into logical pieces (so that the ifs and elifs and elses aren’t so far apart and you can see what’s going on). The amount of space you’re using right now is all over the place. PEP 8 is the de facto community standard.
Hello Karl.
Thanks for your quick reply. I meant to change sg.main_sdk_help() to a comment with a hash sign before posting, as I was just using it as a help facility to try to find out what my problem is. Sorry about that.
As I am using MS Code editor I have a structured indenting system in place. (Copy and paste has distorted this here a bit.)
“This window.close() is inside the while True: loop,” Thank you. I have moved it out to the def Main () function, but it still remains the same ( I have to close the running app with the x icon). I just can’t seem to get into the events to action them.
Any other suggestions?
The next step is to start the actual debugging process. Putting print calls in the code as you’ve done can give useful information, but information is only useful when seen by someone who’s actively trying to understand it.
So.
What results are you getting from the prints? For example, do you ever see anything interesting from print(event, values)? (Do you see anything printed at all, to confirm that the code gets to this point?) How about the other prints? Are the elif cases entered in the situations where you expect?
My guess is that the values you compare event with are wrong, and that the code also needs to care about the values. I don’t know how to use that GUI library, but it looks very suspicious to me to compare event to some sg.Radio result, because it looks like calling sg.Radio is how you made the radio button in the first place. An event is not going to be equal to a widget, and constantly making new widgets is probably not good.
I guess you mean VS Code (Visual Studio Code).
One possible reason for getting this distortion is mixing spaces and tabs. It’s possible to make that work with extreme care, but it’s still a bad idea. Also, if you’re trying to format the code for posting by adding extra indentation, please don’t. Markdown may support that, but it’s much easier and more reliable to use code fences, as described in the pinned thread.
Glad to hear it was as straightforward as I hoped. I really know nothing about PySimpleGUI (besides the recent licensing debacle) - I just know how to solve problems. I hope I was able to impart some wisdom and that in the future you’ll be able to get that much further on your own.
Thank you. Yes indeed you were able to impart some wisdom from which I learnt more. I am an 89 year old hobbyist (so have a free PySimple GUI licence) who decided to start learning Python on a Mac about 3 months ago to prevent the possible onslaught of altheimers. As an Accountant retiring 15 years ago I did some VB database programming but I have a lot to learn here. It is challenging but highly enjoyable as I am learning by doing small projects as well as with a Python course.