更新后如何重启kivy应用退出旧版本并执行新版本

问题描述

下载新版本的应用程序后,如何重新启动kivy应用程序?

我正在开发一个使用kivy框架的python GUI应用程序,我刚刚向我的应用程序添加自动更新功能,该功能可以安全地下载,验证和提取自身的更新版本。完成这些升级步骤后,我向用户显示一个模式对话框,要求他们单击按钮以将应用程序重新启动到较新的版本。

如何获取该按钮以实际关闭窗口并执行新的kivy应用程序?

解决方法

在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应用程序窗口取代。