Сенсорный ввод в Kivy

#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"