问题描述
下载新版本的应用程序后,如何重新启动kivy应用程序?
我正在开发一个使用kivy框架的python GUI应用程序,我刚刚向我的应用程序添加了自动更新功能,该功能可以安全地下载,验证和提取自身的更新版本。完成这些升级步骤后,我向用户显示一个模式对话框,要求他们单击按钮以将应用程序重新启动到较新的版本。
解决方法
在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
应用程序窗口取代。