如何在 kivymd 功能开始时显示加载屏幕?

Posted

技术标签:

【中文标题】如何在 kivymd 功能开始时显示加载屏幕?【英文标题】:How to show loading screen at start of function in kivymd? 【发布时间】:2021-05-15 00:34:23 【问题描述】:

在从 Web 获取数据期间,我想在我的 Kivymd 应用程序中使用加载屏幕。但是当我运行我的代码时,获取数据后会出现加载屏幕。

我想显示加载屏幕,从网络获取一些数据,然后在新屏幕上显示结果。 这是我的get_data 函数的一部分。该函数在用户点击按钮时运行。

def get_data(self):
    self.root.ids.MainScreen.pos_hint = "center_x": .5, "center_y": 50 # Hide main screen
    self.root.ids.LoadingScreen.pos_hint = "center_x": .5, "center_y": .5 # Show loading screen
    requests.get("https//.....")
    # Code more

加载大约需要十秒钟。我将屏幕移动代码放在我的函数顶部,但为什么屏幕移动代码在函数之后运行?如何解决?

我使用的是 Windows 10 和 Python 3.8。

【问题讨论】:

【参考方案1】:

您可以在所有请求工作完成之前使用threadingClock.schedule 移动到加载屏幕。查看更多详情here

def get_data(self):
    self.root.ids.MainScreen.pos_hint = "center_x": .5, "center_y": 50 # Hide main screen
    self.root.ids.LoadingScreen.pos_hint = "center_x": .5, "center_y": .5 # Show load screen
    Clock.schedule_once(function_to_get_data)
def function_to_get_data(self, *args):
    #code to get data

更新: 下面是带参数的线程代码:

def get_data(self):
    self.root.ids.MainScreen.pos_hint = "center_x": .5, "center_y": 50 # Hide main screen
    self.root.ids.LoadingScreen.pos_hint = "center_x": .5, "center_y": .5 # Show load screen
    threading.Thread(target = function_to_get_data, args=(param,))
def function_to_get_data(self, param):
    #code to get data

【讨论】:

这似乎可行,但如果我想将参数传递给function_to_get_data 怎么办?我想我不能在Clock.schedule_once(function_to_get_data)中使用参数 This 是调用部分,this 是 get_data 部分。 (我不知道如何在 Stack Overflow 注释中插入多行代码。)但是当我运行这段代码时,它给了我this 错误和TypeError: get_data() takes 1 positional argument but 2 were given。如何解决? 如果您想传递一些数据,那么您可以创建一个类变量,然后在时钟函数中访问该类变量,或者您可以使用线程。线程会做同样的事情,也可以接受变量。 关于错误,Clock.schedule_once 还给出了作为参数执行的时间。我忘记了,对不起,我已经更新了代码【参考方案2】:

您可以使用窗口管理器。没有完整的代码很难说,但类似:

    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.core.window import Window
    
class MainScreen(Screen):
...
    def get_data(self):
        self.parent.current = 'LoadingWindow'
        get your data
        wait for it to return
        self.parent.current = 'MainWindow'
...
class LoadingScreen(Screen):
    pass
...
class WindowManager(ScreenManager):
    pass

这假设 a.o. get_data 在 MainScreen 类中,LoadingScreen 和 MainScreen 被定义为窗口管理器中的屏幕,就像这样(在 .kv 中)

WindowManager:
    LoadingScreen:
    MainScreen:

<MainScreen>:
    id: mainWindow
    ...

<LoadingScreen>:
    id: LoadingWindow
    ...

【讨论】:

这个例子正在运行代码但无法显示加载画面,它只是等待等待过程完成,直接进入“MainScreen”而不显示加载画面

以上是关于如何在 kivymd 功能开始时显示加载屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何在启动时显示 KivyMD 数据表?

如何在 .DAE 环境和角色加载时显示加载屏幕?

仅在 kivy 首次启动时显示设置屏幕

如何在Angular2中使用导航进行路由时显示加载屏幕?

如何隐藏我的 Android 应用程序在加载时显示的“InstanceID 令牌:”框

如何在android中将url加载到webview时显示进度?