Сделайте кнопку Выбрать все из нескольких кнопок CheckButton внутри ListBox - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь составить список, в каждой строке которого есть checkButton, и в верхней части этого списка я хочу выбрать опцию Выбрать / Отменить выбор всех.Проблема в том, что я даже не могу понять, как перебирать CheckButtons, чтобы использовать что-то вроде 'Gtk.CheckButton.Set_activate (True)'.Я полностью потерян с этой проблемой.

Вот мой код пока

class ListChapters(Gtk.Window):

def __init__(self):
    Gtk.Window.__init__(self, title="List of Itens")
    self.set_border_width(10)

    box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
    self.add(box_outer)

    listbox = Gtk.ListBox()
    listbox.set_selection_mode(Gtk.SelectionMode.NONE)
    box_outer.pack_start(listbox,False, False, 0)

    row = Gtk.ListBoxRow()
    hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
    row.add(hbox)
    label = Gtk.Label('Marcar/Desmarcar tudo.', xalign=0)
    checkall = Gtk.CheckButton()
    hbox.pack_start(label, True, True, 0)
    hbox.pack_end(checkall, False, True, 0)
    listbox.add(row)
    checkall.connect("toggled", self.mark_all)

    listbox2 = Gtk.ListBox()
    listbox2.set_selection_mode(Gtk.SelectionMode.NONE)
    box_outer.pack_start(listbox2, True, True, 0)

    index = ['Item1','Item2','Item3']

    for i in index:
        row = Gtk.ListBoxRow()
        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
        row.add(hbox)
        cap = Gtk.Label(i, xalign=0)
        check = Gtk.CheckButton()
        hbox.pack_start(cap, True, True, 0)
        hbox.pack_start(check, False, True, 0)
        listbox2.add(row)
        check.connect("toggled", self.on_check_marked)

1 Ответ

0 голосов
/ 03 мая 2019

Вопрос : кнопка выбора нескольких кратных кнопок CheckButton внутри ListBox
... я даже не могу понять, как перебирать CheckButtons

В основном вы можете сделать:

for boxrow in listbox2:

GTK 3.0 (3.24.5) Документация:


  1. Определите ваше собственное ListBoxRow наследование от Gtk.ListBoxRow

    class ListBoxRow(Gtk.ListBoxRow):
        def __init__(self, label, **kwargs):
            super().__init__(**kwargs)
    
  2. Определите свои виджеты и сделайте self.check a class attribute.

            hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
            self.add(hbox)
    
            cap = Gtk.Label(label, xalign=0)
            hbox.pack_start(cap, True, True, 0)
    
            self.check = check = Gtk.CheckButton()
            hbox.pack_start(check, False, True, 0)
    
            check.connect("toggled", self.on_check_marked)
    
  3. Определите от class methode checkbutton(... до , установите и получите active state из CheckButton

        def checkbutton(self, state=None):
            print('checkbutton({})'.format(state))
            if state is True:
                self.check.set_active(state)
            elif state is False:
                self.check.set_active(state)
            else:
                return self.check.get_active()
    
  4. Чтобы сделать check.connect(... счастливым ...

        def on_check_marked(self, event):
            print('on_check_marked({})'.format(event))
    

Использование

  1. Добавьте ваш ListBoxRow(... к listbox2

            for label in ['Item1','Item2','Item3']:
                row = ListBoxRow(label=label)
                listbox2.add(row)
    
  2. Повтор ListbBox для установки все CheckButton в ListBoxRow в соответствии с переданным CheckButton active state.

        def mark_all(self, checkbox):
            for boxrow in self.listbox2:
                boxrow.checkbutton(state=checkbox.get_active())
    

Протестировано с Python: 3.5 - gi .__ версия__: 3.22.0

...