簡體   English   中英

Kivy小部件不移動

[英]Kivy Widget not moving

程序運行時, ScreenManager顯示主屏幕,在該主屏幕上添加了白色的小square(Ball)

小部件Ball應該會四處移動,但我不知道為什么它仍然是靜態的。 更新方法有效,但是窗口小部件的位置未更新。 我試圖四處移動,但沒有任何效果。

如果有人可以幫助我了解我在哪里錯了,那太好了。 非常感謝。

import kivy
kivy.require('1.10.1')
from kivy.app import App
from kivy.core.window  import Window
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.graphics import Rectangle
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
from kivy.clock import Clock

# simple Screen on which the ball should move
class Main(Screen):
    def __init__(self, **kwargs):
        super(Main, self).__init__(**kwargs)
        self.add_widget(Ball())
        with self.canvas.before:
            Rectangle(source = 'BG1.png',
                      size = Window.size,
                      pos = self.pos)

# the Ball should be bouncing around
class Ball(Widget):
    velocity = ListProperty([10, 15])
    def __init__(self, **kwargs):
        super(Ball, self).__init__(**kwargs)
        Clock.schedule_interval (self.update, 1 / 60)

        with self.canvas:
            Rectangle (color=[0, 0, 0, 1],
                       size=(10, 10),
                       pos = self.pos)

    def update(self, *args):
        print('wtf')
        self.x += self.velocity[0]
        self.y += self.velocity[1]

        if self.x < 0 or (self.x + self.width) > Window.width:
            self.velocity[0] *= -1
        if self.y < 0 or (self.y + self.height) > Window.height:
            self.velocity[1] *= -1

Window.size = (400, 300)
sm = ScreenManager()
sm.add_widget(Main(name = 'main'))

class Bubble(App):
    def build(self):
        return sm

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

謝謝Embryo和John,您的回答使我找到了正確的答案。 我在此博客上找到了此代碼。 解決了所有問題: Kivy博客

from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color

class CornerRectangleWidget(Widget)
    def __init__(self, **kwargs):
        super(CornerRectangleWidget, self).__init__(**kwargs)

        with self.canvas:
            Color(1, 0, 0, 1)  # set the colour to red
            self.rect = Rectangle(pos=self.center,
                                  size=(self.width/2.,
                                        self.height/2.))

        self.bind(pos=self.update_rect,
                  size=self.update_rect)

    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size

問題是,當您在python中(而不是在kv )設置Canvas指令時,您不會獲得kv為您提供的自動綁定。 因此,您在Ball.__init__()方法中定義的Rectangle將其pos定義為在__init__()時刻(即[0,0])處Ballpos ,並且它不會自動更改。 您可以自己進行更新來解決此問題。 首先,在Ball.__init__()with self.canvas塊更改為:

    with self.canvas:
        Color(0,0,0,1)
        self.rect = Rectangle (size=(10, 10),
                   pos = self.pos)

一種變化是定義Color ,第二種變化是創建對Rectangle的引用。 然后在更新方法中添加以下行:

self.rect.pos = self.pos

這將使矩形與Ball位置一起移動。

此外,您的update方法有一些問題,因為size的的Ball是大小相同的Window 它不是您在Rectangle提供的size

好吧,這是怎么回事...

實例化Ball小部件時,只需繪制一次矩形。
這是您在左下角看到的。
之后,您可以移動小部件,但是不會再次繪制它。

如果在更新功能中print(self.pos) ,您會發現它正在移動...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM