PySimpleGUI GUI调用subprocess启动Chrome后脚本终止问题求助
解决PySimpleGUI点击按钮后脚本终止的问题
嘿,作为Python新手能写出第一个GUI脚本已经超棒啦!咱们来搞定这个点击「Maths exercise repo」按钮后GUI就关闭的问题~
问题根源
你当前用subprocess.Popen时加了stdout=subprocess.PIPE和stderr=subprocess.PIPE,这两个参数会让Python创建管道来捕获Chrome的输出。但如果不去主动读取这些管道里的内容,当输出积累到一定量时,Chrome进程会被阻塞,进而导致你的GUI主线程卡住甚至终止,看起来就像脚本自己关掉了。
而且对于打开浏览器这种场景,你根本不需要捕获它的输出,所以这两个参数完全是多余的,反而会帮倒忙。
解决方案1:修改subprocess代码
直接去掉那两个管道参数,让Chrome独立运行,不会影响你的GUI主线程:
if event == 'Maths exercises repo': # 移除stdout和stderr参数,让Chrome正常独立运行 subprocess.Popen([CHROME, '你的数学习题仓库URL'], shell=True)
解决方案2:用更简单的webbrowser模块(推荐新手)
Python自带的webbrowser模块可以直接打开URL,不需要手动指定Chrome路径,系统会自动调用默认浏览器,代码更简洁:
首先在脚本顶部导入模块:
import webbrowser
然后修改按钮事件的处理代码:
if event == 'Maths exercises repo': webbrowser.open('你的数学习题仓库URL') # 替换成实际的URL即可
确保你的事件循环完整
最后别忘了确认你的GUI事件循环是正常运行的,完整的结构应该像这样:
import PySimpleGUI as sg import subprocess import webbrowser # 如果用方案2的话需要导入 CHROME = "你的Chrome路径" # 比如Windows下可能是"C:/Program Files/Google/Chrome/Application/chrome.exe" layout = [ [sg.Text('Your typed chars appear here:')], [sg.Text('It. Lit. pages', size=(15, 1)), sg.Input(key='str_ITLP')], [sg.Text('MAT quiz pages', size=(15, 1)), sg.Input(key='str_MATQ')], [sg.Text('Math exercises', size=(15, 1)), sg.Input(key='str_MATH')], [sg.Button('Show'), sg.Button('Exit'), sg.Button('Maths exercise repo')] ] window = sg.Window('Pattern 2B', layout) # 核心事件循环,必须一直运行才能保持GUI打开 while True: event, values = window.read() # 处理关闭窗口或Exit按钮 if event == sg.WIN_CLOSED or event == 'Exit': break # 处理Show按钮(如果有逻辑的话) if event == 'Show': # 这里可以添加Show按钮的功能,比如打印输入的内容 print("It. Lit. pages:", values['str_ITLP']) print("MAT quiz pages:", values['str_MATQ']) print("Math exercises:", values['str_MATH']) # 处理打开数学习题仓库的按钮 if event == 'Maths exercise repo': # 方案1:用subprocess # subprocess.Popen([CHROME, '你的实际URL'], shell=True) # 方案2:用webbrowser(更简单) webbrowser.open('https://你的数学习题仓库地址.com') # 关闭窗口 window.close()
这样修改后,点击按钮打开Chrome后,你的GUI会继续保持运行,完全不影响其他按钮的使用~
内容的提问来源于stack exchange,提问作者almosca 99
相关产品推荐
相关产品推荐

