为了账号安全,请及时绑定邮箱和手机立即绑定

需要帮助删除/删除 kivy 小部件

需要帮助删除/删除 kivy 小部件

九州编程 2022-12-20 12:14:54
下面的代码制作了一个带有大按钮的应用程序,该按钮制作并附加了单独的“行”小部件(实际上只有 3 个标签和一个按钮在单个网格布局中,代表一个小部件)到滚动视图的底部。我想要一些方法来连续按下“删除此”按钮以删除该特定行。我想我需要一些方法来以某种方式区分这些生成的行,但我也还没有弄清楚。如果有人对此有一个优雅的解决方案,我会很高兴,因为我已经被困在这里很长一段时间了。虚拟程序的屏幕截图from kivy.app import Appfrom kivy.lang import Builderfrom kivy.uix.gridlayout import GridLayoutfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.uix.scrollview import ScrollViewfrom kivy.uix.button import Buttonfrom kivy.uix.label import Labelkv = '''<Label>:    font_size: 35<delete_btn>:    background_color: 1, 0, 0, 1    size_hint_y: None    text: 'Delete this'    font_size: 25<RootWidget>:    orientation: 'vertical'    Button:        size_hint: 1, .25        font_size: 50        pos_hint: {'x': 0, 'top': 1}        text: 'append row'        on_press: rootgrid.append_row()    ScrollviewLayout:        scroll_type: ['bars', 'content']        bar_width: 10        pos_hint: {'x': 0, 'y': .2}        RootGridLayout:            id: rootgrid            cols: 1            size_hint_y: None            height: self.minimum_height'''class GridRow(GridLayout):    def __init__(self, **kwargs):        super(GridRow, self).__init__(**kwargs)        self.size_hint_y = None        self.cols = 4        self.add_widget(delete_btn())        self.add_widget(Label(text='00:00:00', size_hint_y=None))        self.add_widget(Label(text='00:00:00', size_hint_y=None))        self.add_widget(Label(text='00:00:00', size_hint_y=None))class RootGridLayout(GridLayout):    def append_row(self):        self.add_widget(GridRow())class delete_btn(Button):    passclass ScrollviewLayout(ScrollView):    passclass RootWidget(BoxLayout):    passclass remtimeApp(App):    def build(self):        root = RootWidget()        return rootif __name__ == '__main__':    Builder.load_string(kv)    remtimeApp().run()
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

我不确定在 Python 中设置 a 是否重要,GridRow但如果不重要,您也可以在 KV 语言中解决您的问题。您只需要更改 GridRow 类的代码:


<Label>:

    font_size: 35


<GridRow>:

    id: row

    cols: 4

    size_hint_y: None

    Label:

        size_hint_y: None

        text: '00:00:00'

    Label:

        size_hint_y: None

        text: '00:00:00'

    Label:

        size_hint_y: None

        text: '00:00:00'

    Button:

        background_color: 1, 0, 0, 1

        size_hint_y: None

        text: 'Delete this'

        font_size: 25

        on_press: row.parent.remove_widget(row)


<RootWidget>:

    orientation: 'vertical'


    Button:

        size_hint: 1, .25

        font_size: 50

        pos_hint: {'x': 0, 'top': 1}

        text: 'append row'

        on_press: rootgrid.append_row()


    ScrollviewLayout:

        scroll_type: ['bars', 'content']

        bar_width: 10

        pos_hint: {'x': 0, 'y': .2}


        RootGridLayout:

            id: rootgrid

            cols: 1

            size_hint_y: None

            height: self.minimum_height

有了这个,就不再需要delete_btn类和函数了。GridRow.__init__


查看完整回答
反对 回复 2022-12-20
?
皈依舞

TA贡献1851条经验 获得超3个赞

您可以在创建GridRow和时传递删除所需的信息delete_btn。以下是更改后受影响的类:


class GridRow(GridLayout):

    def __init__(self, **kwargs):

        self.container = kwargs.pop('container', None)

        super(GridRow, self).__init__(**kwargs)

        self.size_hint_y = None


        self.cols = 4

        self.add_widget(delete_btn(row=self, container=self.container))

        self.add_widget(Label(text='00:00:00', size_hint_y=None))

        self.add_widget(Label(text='00:00:00', size_hint_y=None))

        self.add_widget(Label(text='00:00:00', size_hint_y=None))



class RootGridLayout(GridLayout):

    def append_row(self):

        self.add_widget(GridRow(container=self))



class delete_btn(Button):

    def __init__(self, **kwargs):

        self.container = kwargs.pop('container', None)

        self.row = kwargs.pop('row', None)

        super(delete_btn, self).__init__(**kwargs)


    def on_release(self):

        self.container.remove_widget(self.row)

所以该GridRow __init__()方法现在采用关键字参数container,它应该是RootGridLayout包含GridRows. 该delete_btn __init__()方法采用两个关键字参数container(刚从 传递过来GridRow)和row,它是GridRow包含delete_btn. 这为 提供了从delete_btn中删除其所需的所有信息。现在just的方法执行.GridRowRootGridLayouton_release()delete_btnremove_widget()


查看完整回答
反对 回复 2022-12-20
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信