Python webbrowser调用返回True问题求助(Kivy环境)
问题:Kivy中调用
webbrowser.open()始终返回True,无论浏览器是否关闭 环境:Kivy 2.2.0/2.2.1、Python 3.8.10、Pydroid3
在带按钮的Kivy脚本中,调用webbrowser.open()打开URL后,无论后续是否关闭浏览器,该函数始终返回True;尝试使用simple_webbrowser也出现相同情况。已搜索相关问题未找到解决方案,请求排查。
简化后的测试脚本:
from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen from kivy.lang import Builder import webbrowser # import simple_webbrowser as swb # from kivy.uix.gridlayout import GridLayout from kivy.uix.boxlayout import BoxLayout kv_text = ''' <MyScreenManager>: HomeScreen: <HomeScreen>: BoxLayout: orientation: "vertical" padding: ['11dp','8dp'] spacing: '10dp' BoxLayout: size_hint: 1,.1 orientation: "horizontal" Button: id:results_where text:'Where \\nto stay' background_color:[1,0,0,1] on_press:app.root.btn() ''' class MyScreenManager(ScreenManager): pass class MyButtons(BoxLayout): # def __init__(self,**kwargs): # super().__init__(**kwargs) def mybutton_where(self): wb=webbrowser.open('https://www.montagu.org.za/accommodation/') return wb class HomeScreen(Screen): # def __init__(self,**kwargs): # super(HomeScreen,self).__init__(**kwargs) def btn(self): alt=MyButtons.mybutton_where(self) self.ids['results_where'].text= str(alt) class MyApp(App): def build(self): return HomeScreen() def main(): Builder.load_string(kv_text) app = MyApp() app.run() if __name__ == '__main__': main()
原因分析
webbrowser.open()的返回值仅表示是否成功启动浏览器进程,不会等待浏览器窗口关闭。只要系统能找到可用浏览器并成功启动进程,该函数就会立即返回True,和后续用户是否关闭浏览器无关。simple_webbrowser的逻辑与此一致,因此会出现相同结果。
解决方案
如果需要检测浏览器窗口是否关闭,需改用能跟踪浏览器进程的方式:
1. 用subprocess模块启动并等待进程结束
import subprocess import sys def open_browser_and_wait(url): # 根据系统选择浏览器启动命令 if sys.platform == 'win32': cmd = ['start', url] shell = True elif sys.platform == 'darwin': cmd = ['open', url] shell = False else: # Linux/Pydroid3环境 cmd = ['xdg-open', url] shell = False try: proc = subprocess.Popen(cmd, shell=shell) proc.wait() # 阻塞等待浏览器进程结束 return True # 进程正常结束返回True except Exception as e: print(f"启动浏览器失败: {e}") return False
2. 修改原有代码逻辑
- 调整
MyButtons中的方法为静态方法(避免实例化问题):
class MyButtons(BoxLayout): @staticmethod def mybutton_where(): result = open_browser_and_wait('https://www.montagu.org.za/accommodation/') return result
- 修改
HomeScreen的btn方法调用:
def btn(self): alt = MyButtons.mybutton_where() self.ids['results_where'].text = str(alt)
注意:Pydroid3环境中xdg-open通常可用,若遇到启动失败,可尝试指定设备上具体浏览器的路径(如/system/bin/chrome)。
内容的提问来源于stack exchange,提问作者sybe
相关产品推荐
相关产品推荐

