Python Kivy Image поворот по событию - PullRequest
0 голосов
/ 29 января 2020

Помогите повернуть изображение по событию в функции def read_sok():.

Доступ к TestPY().update() не приводит к повороту изображения. print("update") строка выполняется

угол поворота изображения отправляется с сервера

приложение разрабатывается для имитации устройства переключения

from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.graphics import Rotate
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics.context_instructions import PopMatrix, PushMatrix

# Socket client example in python

import socket
import sys
import threading

host = '192.168.12.95'
port = 2000  # web

a = 0
b = 0
c = 0

# create socket
print('# Creating socket')
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print('Failed to create socket')
    sys.exit()

print('# Getting remote IP address')
try:
    remote_ip = socket.gethostbyname(host)
except socket.gaierror:
    print('Hostname could not be resolved. Exiting')
    sys.exit()

# Connect to remote server
print('# Connecting to server, ' + host + ' (' + remote_ip + ')')
s.connect((remote_ip, port))

# Send data to remote server
print('# Sending data to server')
request = "hello server"

try:
    s.sendall(request.encode('utf-8'))
except socket.error:
    print('Send failed')
    sys.exit()

# Receive data
print('# Receive data from server')
reply = s.recv(4096)

print(reply)


def read_sok():
    global a, b, c
    while 1:
        data = s.recv(1024)
        print(data.decode('utf-8'))
        b = int(data.decode('utf-8'))
        TestPY().update()


potok = threading.Thread(target=read_sok)
potok.start()


class TestKV(Image):
    angle = NumericProperty(0)


Builder.load_string('''
<TestPY>:
    canvas.before:
        PushMatrix
        Rotate:
            angle: root.angle
            axis: 0, 0, 1
            origin: root.center
    canvas.after:
        PopMatrix
''')


class TestPY(Image):
    global a, b, c
    angle = NumericProperty(0)

    def __init__(self, **kwargs):
        super(TestPY, self).__init__(**kwargs)
        # self.x = x -- not necessary, x is a property and will be handled by super()
        with self.canvas.before:
            PushMatrix()
            self.rot = Rotate()
            self.rot.angle = 0
            self.rot.origin = self.center
            self.rot.axis = (0, 0, 1)

        with self.canvas.after:
            PopMatrix()

    def on_touch_down(self, touch):
        self.rot.angle = b

    def update(self):
        self.rot.angle = b
        print("update")

    def dd(self):
        rot.angle = b
        print("dd")


class MainWidget(Widget):
    # this is the main widget that contains the game.

    def __init__(self, **kwargs):
        super(MainWidget, self).__init__(**kwargs)
        self.all_sprites = []

        self.k = TestKV(source="dd1.png", x=10, size=(400, 400))
        self.add_widget(self.k)

        self.p = TestPY(source="dd2.png", x=10, size=(400, 400))
        self.add_widget(self.p)


class TheApp(App):

    def build(self):
        parent = Widget()
        app = MainWidget()
        parent.add_widget(app)
        return parent


if __name__ == '__main__':
    TheApp().run()

введите описание изображения здесь

1 Ответ

0 голосов
/ 29 января 2020

Полагаю, это происходит потому, что у вас есть угол поворота, определенный в 'init'. Пока вы запускаете TestPY (). Update (), он сначала создает новый объект класса, поворачивает его на 0 °, а затем запускает метод обновления, когда вращение закончено.

Вы можете попробовать определите ваш угол в методе init, возможно, это сработает:

while 1:
    ...
    TestPY(b)


class TestPY(Image):
    ...
    def __init__(self, b, **kwargs):
        super(TestPY, self).__init__(**kwargs)

        with self.canvas.before:
            PushMatrix()
            self.rot = Rotate()
            self.rot.angle = b
            self.rot.origin = self.center
            self.rot.axis = (0, 0, 1)

Или вы можете определить свой угол как NumericProperty () и не создавать новые экземпляры класса в безграничном l oop. Так что вы можете попробовать это:

tp = TestPY()
while 1:
    ...
    tp.update(b)


class TestPY(Image):
    ...
    def __init__(self, **kwargs):
        super(TestPY, self).__init__(**kwargs)

        with self.canvas.before:
            PushMatrix()
            self.rot = Rotate()
            self.rot.angle = self.b
            self.rot.origin = self.center
            self.rot.axis = (0, 0, 1)

    self.b = NumericProperty()

    def update(self, b):
        self.b = b
        print("update")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...