KIVY "[КРИТИЧЕСКИЙ] [Часы] Предупреждение" on_touch_move - PullRequest
0 голосов
/ 11 апреля 2020

Я написал небольшой код для горизонтального перетаскивания виджета с помощью события on_touch_move. Даже мой виджет движется горизонтально. Но когда я перетаскиваю виджет, генерируется следующий журнал. " [CRITICAL] [Clock] Предупреждение, слишком много итераций сделано перед следующим кадром. Проверьте свой код или увеличьте атрибут Clock.max_iteration ». Пожалуйста, найдите ниже мой пример кода. Чтобы воспроизвести этот сценарий, просто перетащите белый виджет вправо и влево. Приведенные выше сообщения журнала распечатываются.

from kivy.app import App
from kivy.graphics import Rectangle
from kivy.uix.scatter import Scatter
from kivy.uix.relativelayout import RelativeLayout


class MyPaintWidget(Scatter):

    def __init__(self, **kwargs) :
        super(MyPaintWidget, self).__init__(**kwargs)

    def on_touch_move(self, touch):
        touch_x_hint = touch.x / self.parent.size[0]
        self.pos_hint = {'center_x': touch_x_hint }
        return super(Scatter, self).on_touch_move(touch)

class MyPaintApp(App):

    def build(self):
        parent = RelativeLayout()

        Wdgt = MyPaintWidget(pos_hint={'center_x':0.5, 'center_y':0.5}, size_hint=(0.2,0.2))
        with Wdgt.canvas:
            Rectangle(pos_hint = {'center_x':0.5, 'center_y':0.5}, size = (Wdgt.width, Wdgt.height))

        parent.add_widget(Wdgt)
        return parent

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

1 Ответ

1 голос
/ 11 апреля 2020

Я вижу две проблемы с вашим кодом. Во-первых, ваш super() вызов в MyPaintWidget.on_touch_move() должен пройти MyPaintWidget, а не Scatter. Во-вторых, использование pos_hint требует дополнительных вычислений, поэтому я предлагаю изменить on_touch_move() на:

def on_touch_move(self, touch):
    self.pos_hint = {'center_y':0.5}  # eliminates the x pos_hint
    self.x = touch.x
    return super(MyPaintWidget, self).on_touch_move(touch)
...