我构建了一个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部分,因为应用程序已经正常工作。
答案 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)
进行完全相同的调用