【问题标题】:How to restart kivy app after updating (exit old version & execute new version)更新后如何重新启动kivy应用程序(退出旧版本并执行新版本)
【发布时间】:2020-09-13 02:42:25
【问题描述】:
下载新版本后如何让 kivy 应用重新启动?
我正在开发一个使用 kivy 框架的 python GUI 应用程序,我刚刚向我的应用程序添加了一个自动更新功能,可以安全地下载、验证和提取自身的更新版本。完成这些升级步骤后,我会向用户显示一个模式对话框,要求他们单击按钮以将应用重新启动到较新版本。
如何让该按钮真正关闭窗口并执行新的 kivy 应用程序?
【问题讨论】:
标签:
python
python-3.x
kivy
exec
execv
【解决方案1】:
在python中,可以使用os.execv()退出当前进程,替换为另一个执行。
以下命令演示了如何在 Debian 10 中使用 kivy 执行此操作:
sudo apt-get -y install python3 python3-pip python3-virtualenv python3-setuptools
sudo dpkg -l | grep python
python3 -m virtualenv --python=python3.7 /tmp/virtualenv/kivy_test
/tmp/virtualenv/kivy_test/bin/python3 -m pip install --upgrade pip kivy
/tmp/virtualenv/kivy_test/bin/python3 -m pip list
source /tmp/virtualenv/kivy_test/bin/activate
tmpDir=`mktemp -d`
pushd "${tmpDir}"
cat << EOF > helloWorldOne.py
#!/usr/bin/env python3
import kivy, os
from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
class MyApp(App):
def build(self):
Clock.schedule_once( self.restart, 1 )
return Label(text='Hello World One!')
def restart(self, dt):
os.execv( 'helloWorldTwo.py', ['helloWorldTwo.py'] )
if __name__ == '__main__':
MyApp().run()
EOF
cat << EOF > helloWorldTwo.py
#!/usr/bin/env python3
import kivy, os
from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
class MyApp(App):
def build(self):
return Label(text='Hello World Two!')
if __name__ == '__main__':
MyApp().run()
EOF
chmod +x helloWorld*.py
./helloWorldOne.py
popd
当上面执行./helloWorldOne.py 时,会出现一个窗口(“旧版本”)。 1 秒延迟后,restart() 函数被执行(它可以被绑定到一个按钮)——它调用os.execv()。
helloWorldOne.py 应用程序窗口已关闭并替换为helloWorldTwo.py 应用程序窗口。