Kivy中remove_widget使用问题求助:按钮无法移除
解决Kivy中
remove_widget移除按钮无效的问题 问题根源
next2方法错误调用super().__init__(**kwargs):该方法是按钮点击回调,并非类构造函数,调用父类初始化会重置Screen实例,完全多余。- 按钮父控件定位错误:
btn2是添加到main_line这个BoxLayout中的,而非直接添加到FirstScr,因此不能直接通过self.remove_widget(self.btn2)移除,必须从它的直接父容器操作。 main_line是局部变量:初始化时的main_line仅存在于__init__方法内,后续方法无法访问,需改为实例属性。
修正后的代码
from kivy.app import App from kivy.uix.button import Button from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.textinput import TextInput from kivy.lang import Builder class FirstScr(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) # 将main_line改为实例属性,供后续方法访问 self.main_line = BoxLayout(orientation = 'vertical', padding=8, spacing=8) go = Label(text='Нажми на нужную кнопку!', halign='center') self.btn = Button(text='Жми!', size_hint=(.3,.2), pos_hint={'center_x':.5}) self.btn2 = Button(text='Не жми сюда!', size_hint=(.3,.2), pos_hint={'center_x':.5}) self.main_line.add_widget(go) self.main_line.add_widget(self.btn) self.main_line.add_widget(self.btn2) self.add_widget(self.main_line) self.btn.on_press = self.next self.btn2.on_press = self.next2 def next(self): # 替换原有布局:先移除旧布局再添加新布局,避免重叠 self.remove_widget(self.main_line) new_main_line = BoxLayout(orientation = 'vertical', padding=8, spacing=8) go2 = Label(text='Молодец!') new_main_line.add_widget(go2) self.add_widget(new_main_line) def next2(self): # 从按钮的直接父容器中移除btn2 self.main_line.remove_widget(self.btn2) class MyApp(App): def build(self): sm = ScreenManager() sm.add_widget(FirstScr(name='first')) return sm MyApp().run()
关键修改说明
- 把
main_line改为self.main_line:让后续方法能直接访问这个容器控件。 - 删除
next2中的super().__init__(**kwargs):回调方法无需初始化父类,这行代码会破坏现有实例状态。 - 调整移除逻辑:调用
self.main_line.remove_widget(self.btn2),从按钮的直接父容器中移除,这才是正确的操作方式。 - 优化
next方法:替换界面时先移除旧布局,避免多个布局重叠显示。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

