#kivy #touch-event
#kivy #событие касания
Вопрос:
У меня есть простое приложение с 2 кнопками и прикрепленными к ним функциями обратного вызова. При нажатии кнопки мне нужно получить и использовать информацию о spos. Я использую следующий код
Python:
class HomeScreen(Screen):
print('Start')
port = "COM7"
bluetooth = serial.Serial(port, 9600)
print("Connected to HC-06")
def button_press_down(self, *args):
print("button pressed @location:")
self.bluetooth.write(b"2")
def button_press_up(self, *args):
print("button pressed @location:")
self.bluetooth.write(b"3")
def on_touch_down(self, touch):
print(touch)
def on_touch_move(self, touch):
pass
class SecondScreen(Screen):
pass
class WindowManager(ScreenManager):
pass
kv=Builder.load_file('touch.kv')
class MainApp(App):
def build(self):
return kv
if __name__ == "__main__":
TestApp = MainApp()
TestApp.run()
файл .kv:
#:import utils kivy.utils
WindowManager:
HomeScreen:
SecondScreen:
<HomeScreen>:
name: "button press"
FloatLayout:
canvas.before:
Color:
rgb: utils.get_color_from_hex("#ffffff")
Rectangle:
size: self.size
pos: self.pos
GridLayout:
canvas.before:
Color:
rgb: utils.get_color_from_hex("#ffffff")
Rectangle:
size: self.size
pos: self.pos
rows: 1
cols: 2
padding:10
Button:
text: "Button_1"
id:send_data_bluettooh
on_press:
root.button_press_down()
Button:
text: "Button_2"
id:send_data_bluettooh_2
on_press:
root.button_press_up()
<SecondScreen>:
name: "SecondScreen"
Я могу получить spos, перезаписав fct «on_touch_down». Проблема в том, что мой fct button_press_down() больше не вызывается, когда я нажимаю кнопку 1. Могу ли я каким-либо образом использовать информацию о spos и при этом сохранить функцию обратного вызова button_press_down() моей кнопки?
Ответ №1:
Вы можете получить touch.spos
, расширив Button
класс, чтобы он запоминал эту информацию. Вот модифицированная версия вашего кода, которая делает это:
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
class MyButt(Button):
last_touch_down = ListProperty([])
last_touch_up = ListProperty([])
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
self.last_touch_down = touch.spos
return super(MyButt, self).on_touch_down(touch)
def on_touch_up(self, touch):
if self.collide_point(*touch.pos):
self.last_touch_up = touch.spos
return super(MyButt, self).on_touch_up(touch)
class HomeScreen(Screen):
print('Start')
port = "COM7"
bluetooth = serial.Serial(port, 9600)
print("Connected to HC-06")
def button_press_down(self, button):
print("button pressed @location:", button.last_touch_down)
self.bluetooth.write(b"2")
def button_press_up(self, button):
print("button pressed @location:", button.last_touch_down)
self.bluetooth.write(b"3")
# def on_touch_down(self, touch):
# print(touch)
# return super(HomeScreen, self).on_touch_down(touch)
#
# def on_touch_move(self, touch):
# pass
class SecondScreen(Screen):
pass
class WindowManager(ScreenManager):
pass
kv=Builder.load_file('touch.kv')
class MainApp(App):
def build(self):
return kv
if __name__ == "__main__":
TestApp = MainApp()
TestApp.run()
И замена Button
на MyButt
в kv
:
#:import utils kivy.utils
WindowManager:
HomeScreen:
SecondScreen:
<HomeScreen>:
name: "button press"
FloatLayout:
canvas.before:
Color:
rgb: utils.get_color_from_hex("#ffffff")
Rectangle:
size: self.size
pos: self.pos
GridLayout:
canvas.before:
Color:
rgb: utils.get_color_from_hex("#ffffff")
Rectangle:
size: self.size
pos: self.pos
rows: 1
cols: 2
padding:10
MyButt:
text: "Button_1"
id:send_data_bluettooh
on_press:
root.button_press_down(self)
MyButt:
text: "Button_2"
id:send_data_bluettooh_2
on_press:
root.button_press_up(self)
<SecondScreen>:
name: "SecondScreen"