0
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]))

my .kv file :

<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 Answer 1

1

Adding on_release event to Button widget.

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

Notes

Kivy » Touch event basics

By default, touch events are dispatched to all currently displayed widgets. This means widgets receive the touch event whether it occurs within their physical area or not.

...

In order to provide the maximum flexibility, Kivy dispatches the events to all the widgets and lets them decide how to react to them. If you only want to respond to touch events inside the widget, you simply check:

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

Solution

Therefore you want to define class PrinterButton with inheritance of Button widget and implement on_touch_down method to only respond to touch events for Button touched.

Snippets

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}")

Output

Result

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.