Saya telah menulis kode kecil untuk menyeret widget secara horizontal menggunakan acara on_touch_move. Bahkan widget saya bergerak secara horizontal. Tetapi ketika saya menyeret widget, log berikut akan dibuat."[CRITICAL] [Clock ] Peringatan, terlalu banyak iterasi yang dilakukan sebelum frame berikutnya. Periksa kode Anda, atau tingkatkan atribut Clock.max_iteration". Silakan temukan di bawah kode sampel saya. Untuk mereproduksi skenario ini, cukup seret widget putih ke kanan dan kiri. Pesan log di atas akan dicetak.

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()
0
KJG 11 April 2020, 11:44

1 menjawab

Jawaban Terbaik

Saya melihat dua masalah dengan kode Anda. Yang pertama adalah bahwa panggilan super() Anda di MyPaintWidget.on_touch_move() harus melewati MyPaintWidget, bukan Scatter. Kedua, menggunakan pos_hint menyebabkan perhitungan ekstra, jadi saya sarankan untuk mengubah on_touch_move() Anda menjadi:

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)
1
John Anderson 11 April 2020, 14:58