Добавление действия on_release к кнопкам в цикле - PullRequest
0 голосов
/ 30 апреля 2019
class WidgetFiscal(Screen):
    box = ObjectProperty(None)

    def on_box(self, *args):
        fiscal = ['Elzab Mera TE FV', 'Posnet Thermal XL', 'Posnet HD', 'Elzab Sigma', 'Novitus Delio Prime E', 'Elzab D10', 'Posnet Trio', 'Epson TM-T801FV']
        for i in fiscal:
            self.box.add_widget(Button(text=str(i), background_color=[1,2,1,1]))

мой файл .kv:

<FiscalPrinter>:
    name: 'fiscal_printer'

    BoxLayout:
        size: root.size
        spacing: 20
        padding: 10,10,10,10
        orientation: 'vertical'

        Label:
            text: 'Choose fiscal printer which you want to rent'
            size: root.width, root.height / 10
            size_hint: None, None

        WidgetFiscal:

        Button:
            text: 'GO BACK'
            size: root.width, root.height / 10
            size_hint: None, None
            on_release: app.root.current = "rent_device"

<WidgetFiscal>:
    box: box

    GridLayout:
        background_color: 1,2,1,1
        cols: 3
        id: box

1 Ответ

1 голос
/ 30 апреля 2019

Добавление события on_release в Button виджет.

self.box.add_widget(Button(..., on_release=self.mycallback))

Примечания

Kivy »Основы сенсорных событий

По умолчанию сенсорные события отправляются всем отображаемым в данный момент виджеты. Это означает, что виджеты получают событие касания, происходит ли оно в пределах их физической области или нет.

...

Чтобы обеспечить максимальную гибкость, Kivy отправляет события для всех виджетов и позволяет им решать, как реагировать на них. Если вы хотите отвечать только на сенсорные события внутри виджета, вы просто проверьте:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
        # The touch has occurred inside the widgets area. Do stuff!
        pass

Решение

Поэтому вы хотите определить class PrinterButton с наследованием виджета Button и реализовать метод on_touch_down, чтобы реагировать только на события касания для Button touch.

Отрывки

class PrinterButton(Button):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            print(f"\nPrinterButton.on_touch_down: text={self.text}")
            self.dispatch('on_release')
            return True    # consumed on_touch_down & stop propagation / bubbling
        return super(PrinterButton, self).on_touch_down(touch)

class WidgetFiscal(Screen): 
    box = ObjectProperty(None)

    def on_box(self, *args):
        fiscal = ['Elzab Mera TE FV', 'Posnet Thermal XL', 'Posnet HD', 'Elzab Sigma', 'Novitus Delio Prime E', 'Elzab D10', 'Posnet Trio', 'Epson TM-T801FV']
        for i in fiscal:
            self.box.add_widget(PrinterButton(text=str(i), background_color=[1,2,1,1], on_release=self.mycallback))

    def mycallback(self, instance):
        print(f"mycallback: Button.text={instance.text}")

выход

Result

...