簡體   English   中英

來自不同 class kivy 的參考布局

[英]Referencing Layout from a different class kivy

編輯:所以這是我的應用程序中的一個非常簡單的版本,但我認為你明白了。 基本上我想用destroywidgets屏幕上的按鈕銷毀在for循環中創建的按鈕。

.kv:

 MainWindow:

<MainWindow>

    FloatLayout:
        size_hint: 1, .1

        Button:
            text:"next screen"
            size_hint:.1,1
            pos_hint:{"x": 0, "y": 0}
            on_release: app.root.current = "destroywidgets"

        Button:
            text:"laodwidgets"
            on_release: root.create_widgets()
            size_hint:.1, 1
            pos_hint:{"x": .5, "y": 0}

.py:

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.scrollview import ScrollView


class MainWindow(Screen):
    name = "mainwindow"

    def __init__(self, **kwargs):
        super(MainWindow, self).__init__()

        self.scrl_view_1 = ScrollView(
            size_hint_y=.85,
            pos_hint={"x": 0, "y": .15},
            do_scroll_x=False,
            do_scroll_y=True,
            size_hint_x=1
        )

        self.scrl_child_1 = GridLayout(
            size_hint_x=1,
            size_hint_y=None,
            cols=2,
            height=1000,
            row_default_height=150,
            row_force_default=True
        )

        self.add_widget(self.scrl_view_1)
        self.scrl_view_1.add_widget(self.scrl_child_1)

    def create_widgets(self):

        print("creating widgets")

        for i in range(0, 6):

            btn = Button(
                text=str(i)
            )

            self.scrl_child_1.add_widget(btn)

            print("added")


class DestroyWidgets(Screen):
    name = "destroywidgets"

    def __init__(self, **kwargs):
        super(DestroyWidgets, self).__init__()

        btn_destroy_widgets = Button(
            text="Destroy children of Mainwindow",
            #some on release function to clear all children from scrl_child_1 in Mainwindow
        )

        self.add_widget(btn_destroy_widgets)


class ShoppingList(App):

    def build(self):

        self.sm = ScreenManager()
        self.sm.add_widget(MainWindow(name="mainwindow"))
        self.sm.add_widget(DestroyWidgets(name="destroywidgets"))

        return self.sm

if __name__ == "__main__":
    main_app = ShoppingList()
    main_app.run()

所以我必須引用一個 GridLayout,它位於 class B 的 class A 中創建的 ScrollView 內部。因為你不能在 python 代碼中給 Layouts 一個 ID 並自己參考它。 我以weakref.ref方法為例嘗試了另一篇帖子的建議,但我無法讓它工作。 重點是我必須以某種方式從 function 中的其他類中銷毀 Layouts 的所有子項。

這里只是我的代碼的一小段,我認為就足夠了。 如果您需要更多,請寫信給我。 感謝您提前提供的所有幫助!

class SelfMadePlans(Screen):
name = "selfmadeplans"

def __init__(self, **kwargs):
    super(SelfMadePlans, self).__init__()

    self.scrl_view_2 = ScrollView(
        size_hint_y=.85,
        pos_hint={"x": 0, "y": 0},
        do_scroll_x=False,
        do_scroll_y=True,
        size_hint_x=1
    )

    self.scrl_child_2 = GridLayout(
        size_hint_x=1,
        size_hint_y=None,
        cols=3,
        height=20000,
        row_default_height=150,
        row_force_default=True,
    )

    self.add_widget(self.scrl_view_2)
    self.scrl_view_2.add_widget(self.scrl_child_2)

然后是另一個 class 中的內容,例如:

class B:

    def destroy_children(self):

        MDApp.get_running_app().sm.get_screen("selfmadeplans").ids.scrl_child_2.children.clear()

首先你必須通過 var。 不。 __init__中的 kwargs,以便使用和獲取所有默認功能。

...
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
...

等等

接下來要從ScreenManager訪問某個屏幕,您可以使用get_screen方法,如下所示,

...
        btn_destroy_widgets = Button(
            text="Destroy children of Mainwindow",
            #some on release function to clear all children from scrl_child_1 in Mainwindow
        )
        btn_destroy_widgets.bind(on_release = self.destroy_widgets_on_main)

        self.add_widget(btn_destroy_widgets)

    def destroy_widgets_on_main(self, *args):
        main_window = self.manager.get_screen("mainwindow")
        main_window.scrl_child_1.clear_widgets()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM