Python - Kivy - 屏幕一出现就隐藏一个小部件

Python - Kivy - Hiding a widget as soon as screen shows up

我想在屏幕出现后立即隐藏下面代码中的进度条。为此,我定义了一个 hide_widget 函数并将代码添加到“on_pre_enter”部分。但是它不起作用。我在这里错过了什么?

顺便介绍一下在kivy中隐藏widget的更简洁的方法,也非常欢迎。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder

Builder.load_string("""

<MyLayout>

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height
        spacing: 20
        padding: 50

        Button:
            text: "Test"

        ProgressBar:
            id:         pgb_excel_read
            min:        0
            max:        100
            value:      0
            size_hint:  ( 1, 0.1)

""")

def hide_widget(wid, dohide=True):

    if hasattr(wid, 'saved_attrs'):
        if not dohide:
            wid.height, wid.size_hint_y, wid.opacity, wid.disabled = wid.saved_attrs
            del wid.saved_attrs
    elif dohide:
        wid.saved_attrs = wid.height, wid.size_hint_y, wid.opacity, wid.disabled
        wid.height, wid.size_hint_y, wid.opacity, wid.disabled = 0, None, 0, True


class MyLayout(Widget):

    def on_pre_enter(self, *args):
        hide_widget(self.ids.pgb_excel_read, True)

class MyApp(App):
    def build(self):
        return MyLayout()

if __name__ == '__main__':
    MyApp().run()

on_pre_enter 功能仅适用于 Screen 类。但是您尝试在您的自定义 Widget 中使用它。所以没有什么可以触发这个功能。我们可以通过__init__:

触发
class MyLayout(Widget):
    def __init__(self):
        super(MyLayout, self).__init__()
        hide_widget(self.ids.pgb_excel_read, True)

要隐藏任何小部件,我们只需要更改两件事:

  • 已禁用:正确
  • 不透明度:0

这样做的捷径,让我们停止触发任何函数,只更改变量:(同时删除 hide_widget 函数)

class MyLayout(Widget):
    def __init__(self):
        super(MyLayout, self).__init__()
        # hide_widget(self.ids.pgb_excel_read, True)
        self.ids.pgb_excel_read.opacity = 0
        self.ids.pgb_excel_read.disabled = True