You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:03:24