向循环中的按钮添加 on_release 操作
Adding on_release action to buttons in loop
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
正在向 Button
小部件添加 on_release
事件。
self.box.add_widget(Button(..., on_release=self.mycallback))
备注
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
解决方案
因此您想定义 class PrinterButton
并继承 Button
小部件并实现 on_touch_down
方法以仅响应 Button
触摸的触摸事件。
片段
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}")
输出
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
正在向 Button
小部件添加 on_release
事件。
self.box.add_widget(Button(..., on_release=self.mycallback))
备注
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
解决方案
因此您想定义 class PrinterButton
并继承 Button
小部件并实现 on_touch_down
方法以仅响应 Button
触摸的触摸事件。
片段
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}")