Pywebview阻止烧瓶应用,除非我打开两个网页浏览

时间:2017-04-12 11:57:30

标签: python flask webview python-multithreading

我构建了一个python桌面webapp,带有一个相当简单的烧瓶后端,我目前只是通过Chrome服务。我正在尝试使用pywebview打包它,但我遇到了一个非常有障碍的障碍。

我的软件包主文件中的代码如下所示:

import os
import sys
from flasher import app

import httplib

import webview
import threading


def start_prod_server():
    runserver(debug=False, reloader=False)

def start_gui():
    webview.create_window("MyAppName", "http://localhost:5000", height=1000)

def runserver(debug=True, reloader=False):
    port = int(os.environ.get('PORT', 5000))
    url = "http://localhost:{}".format(port)

    print("ready!")
    app.run(host='::', port=port, debug=debug, use_reloader=reloader)


if __name__ == '__main__':
    t = threading.Thread(target=start_prod_server)
    t.daemon = True
    t.start()

    # This never works
    threading.Timer(1.5, start_gui).start()

    sys.exit()

几乎系统地失败,窗口显示为空白,后端不响应任何内容(包括来自单独桌面浏览器的请求)。

我意外地发现如果我启动两个webview线程,它总是有效:

if __name__ == '__main__':
    t = threading.Thread(target=start_prod_server)
    t.daemon = True
    t.start()

    # This works every time
    threading.Timer(1.5, start_gui).start()
    threading.Timer(1.5, start_gui).start()

    sys.exit()

可能导致这种情况的原因是什么?我对Python中的线程的理解相当有限,所以我不确定在哪里看。这可能是pywebview中的错误,还是我的线程出错?

我也对webview部分的替代方案的建议持开放态度,但我想保留python / flask部分,因为应用程序已经正常工作。

1 个答案:

答案 0 :(得分:0)

好吧,经过一番挖掘,我想我自己找到了解决方案。

无论出于何种原因,webview.create_window()都没有导航到该页面并卡住了。打开第二个窗口导致两个窗口都导航到该URL并允许该应用程序继续。 (我仍然不明白为什么)

只需添加webview.load_url("http://localhost:5000")就可以解决问题:

if __name__ == '__main__':
    t = threading.Thread(target=start_prod_server)
    t.daemon = True
    t.start()

    threading.Timer(1.5, start_gui).start()
    webview.load_url("http://localhost:5000")

    sys.exit()

对于为什么会发生这种情况的任何见解仍然是受欢迎的...在pywebview的源代码中,这两种方法对self.browser.web_browser.Navigate(url)进行完全相同的调用