如果没有代码示例,很难准确理解您的意思,但我相信这应该会有所帮助。
答案解释
使用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)
如果按钮嵌套在布局中(GridLayout、FloatLayout 等),则在 screen.remove_my_widget 中传递给 remove_widget 的内容会有点棘手。如果你了解 id 的工作原理,可以直接访问按钮,否则你必须获取布局实例并调用my_layout.remove_widget(self.btnToRemove)