【问题标题】:Removing a widget(floatlayout) in a screen on pressing a button in other screen present in same screen manager inkivy在按下同一屏幕管理器中存在的其他屏幕中的按钮时删除屏幕中的小部件(浮动布局) inkivy
【发布时间】:2022-07-03 10:32:49
【问题描述】:

如何通过在两个屏幕位于同一个 screenManager 的不同屏幕中按下按钮来删除屏幕中存在的小部件?为简化起见,想象任何移动应用程序 ui 的情况,其中主页有通知铃铛(带有不同颜色的通知指针),当有新通知显示时,当用户将所有通知标记为读取通知上的指针时铃铛被移除。我想在我的应用中做同样的事情。

我可以重现相同的代码,但这会使事情变得更复杂。这就是为什么我写了我的问题的描述,因为这个问题需要首先被理解。之后我可以在下面展示代码。我可以通过在我的通知屏幕中触发一个功能(按下读取按钮)来打印主屏幕中的 ID

【问题讨论】:

  • 而且代码太长了,这也是我这里没有附上代码的原因,等大家有问题明白的时候再做
  • 添加一个小例子来演示你想要什么,几乎总是可以通过编写 100 行代码来完成
  • 好的,现在就上传一个代码sn-p riht

标签: android python-3.x kivy kivy-language kivymd


【解决方案1】:

如果没有代码示例,很难准确理解您的意思,但我相信这应该会有所帮助。

答案解释

使用root.manager.get_screen('screen name') 来获取screenmanager 中任意屏幕的实例,结合remove_widget 可以移除任意小部件。

代码示例

在您的 .kv 文件中,您有如下定义的 SomeScreen,这将允许您访问属于 MainScreen 的一些小部件(例如 Button)。正如您所提到的,它们唯一的共同点是它们都共享相同的ScreenManager

<SomeScreen>:
    GridLayout:
        cols: 1
        Button:
                size_hint: .3, .3
                pos_hint: {'center_x': 0.5, 'center_y' :0.5}
                text: 'DELETE WIDGET FROM MAINSCREEN'
                on_release:
                    # the magic line (replace 'mainscreen' with your target screename)
                    root.manager.get_screen('mainscreen').remove_my_widget()

在您的另一个屏幕中(在本例中为 MainScreen),将此函数添加到您的 .py 文件中。

在 MainScreen.py 中

class MainScreen(Screen):
    # ... whatever functions you may have in here
    def remove_my_widget(self, *args):
        # this will be called from SomeScreen.kv
        # `self` is the screen

        # if the button was saved to the class 
        # (e.g. somewhere in this .py file you have self.btnToRemove = Button(...))
        # then you call .remove_widget(self.btnToRemove)

         

        # if the button was created in .kv, assign it an id and use the following line (change depending on the id)
        self.remove_widget(self.ids.ButtonToRemove)

如果按钮嵌套在布局中(GridLayoutFloatLayout 等),则在 screen.remove_my_widget 中传递给 remove_widget 的内容会有点棘手。如果你了解 id 的工作原理,可以直接访问按钮,否则你必须获取布局实例并调用my_layout.remove_widget(self.btnToRemove)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多