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
答案 0 :(得分:1)
将on_release
事件添加到Button
小部件。
self.box.add_widget(Button(..., on_release=self.mycallback))
默认情况下,触摸事件将分派给所有当前显示的事件 小部件。这意味着小部件会接收触摸事件,无论它是否发生 不在他们的物理区域内。
...
为了提供最大的灵活性,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
被触摸的触摸事件。
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}")