[英]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])處Ball
的pos
,並且它不會自動更改。 您可以自己進行更新來解決此問題。 首先,在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.