亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

需要幫助刪除/刪除 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中刪除其所需的所有信息?,F在just的方法執行.GridRowRootGridLayouton_release()delete_btnremove_widget()


查看完整回答
反對 回復 2022-12-20
  • 2 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號