当前位置: 首页 > 知识库问答 >
问题:

Kivy小部件行为不稳定

祝宾白
2023-03-14

我一直在玩KivyPong教程,了解框架的最新情况,看看是否可以实现一些想法。我已经删除了大部分乒乓球功能,所以我只能在屏幕上显示弹跳球,并添加了一些代码来生成屏幕上的多个弹跳球,在触摸时生成。效果很好。然后,我添加了一些额外的画布说明,因此我将绘制一条线,指示球移动的方向。这就是事情变得奇怪的地方。第一个球的动作就像它应该做的一样,在屏幕上弹跳。但接下来的任何点击都会产生球,球会离开屏幕,随机改变方向和速度,通常表现得很混乱。我一直在看我的代码,似乎找不到任何可能出错的迹象。我保留了对小部件的所有引用,我将它们添加到根小部件,我似乎没有在它们之间共享任何信息。。。不管怎么说,这是密码,也许有人能启发我。使用最新的kivy和python 3.6。

from random import randint

from kivy.app import App

from kivy.clock import Clock
from kivy.config import Config
from kivy.vector import Vector
from kivy.uix.widget import Widget
from kivy.properties import AliasProperty, ListProperty, NumericProperty, ReferenceListProperty


class Playground(Widget):
    critters = ListProperty([])

    def update(self, dt):
        for critter in self.critters:
            critter.move()
            if (critter.y  self.height):
                critter.v_y *= -1
            if (critter.x  self.width):
                critter.v_x *= -1
        self.score.text = "{}".format(len(self.critters))

    def on_touch_down(self, touch):
        critter = Critter()
        critter.pos = touch.x, touch.y
        self.critters.append(critter)
        self.add_widget(critter)


class Critter(Widget):
    angle = NumericProperty(0)
    v_x = NumericProperty(0)
    v_y = NumericProperty(0)
    velocity = ReferenceListProperty(v_x, v_y)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.velocity = Vector(5, 0).rotate(randint(0, html" target="_blank">360))
        self.angle = Vector(*self.velocity).angle(Vector(1, 0))

    def move(self):
        self.pos = Vector(*self.velocity) + self.pos
        self.angle = Vector(*self.velocity).angle(Vector(1, 0))


class WorldApp(App):
    def build(self):
        game = Playground()
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game

if __name__ == '__main__':
    Config.set('kivy', 'desktop', 1)
    Config.set('kivy', 'exit_on_escape', 1)
    Config.set('graphics', 'resizable', 0)
    WorldApp().run()

还有KV文件

<Playground>
    score: score

    canvas:
        Color:
            rgb: 0.0, 0.1, 0.0
        Rectangle
            pos: self.pos
            size: self.size

    Label:
        id: score
        pos: self.parent.width - self.size[0], self.parent.height - self.size[1]
        font_size: 16
        size: self.texture_size


<Critter>
    size: 30, 30
    canvas:
        Rotate:
            angle: self.angle
            origin: self.center
            axis: 0, 0, 1
        Color:
            rgb: 0.5, 0.0, 0.0
        Ellipse:
            pos: self.pos
            size: self.size
        Color:
            rgb: 1, 1, 0.0
        Line:
            width: 2
            points: self.center[0], self.center[1], self.center[0] + self.size[0] / 2, self.center[1]

共有1个答案

应俭
2023-03-14

我不确定它是否会导致你的问题,但是你的旋转指令不受小部件规则的限制,并且会影响任何以后的小部件——所以每个小部件的旋转应用于每一个以后的小部件。

为了避免这种情况,在画布规则的顶部添加PushMatrix:,在底部添加PopMatrix:。这些指令有效地保存,并在更改之前恢复到初始旋转状态。

 类似资料:
  • 我试着用Kivy模仿flappy birds,但目前我的处境很艰难。问题是我不知道如何在视图中创建多个小部件。 现在我的kv文件中有: 目前我能够制作单列,所以问题是如何制作才能有多列?

  • 我正在使用Kivy python库。 我定义了两个小部件。 当程序运行时,我运行第一个小部件。 当按下widgets按钮时,我希望它消失并被第二个widget替换。 这是两个小部件的. kv 我的主python文件运行应用程序,并返回第一个小部件 我的第一个小部件有一个回调。这就是问题代码所属的位置 这里的想法是有一个用户界面管理器。此管理器不像树那样运行UI,而是像列表和堆栈一样运行UI。该列表

  • 我想问一下,我如何在我的应用程序中动态添加一些小部件,一个接一个,而不是一次添加完。这些小部件被添加到包含命令的for循环中,并由按钮触发。所以我想知道是否有办法在执行结束时逐渐显示输出,而不是一次显示完。起初,我试图在for循环中添加延迟,但恐怕这与每次构建输出的方式有关。 编辑:嗯,似乎我没有很好地理解和的用法,所以我对他们(或time.sleep)的尝试没有成功在所有。但显然,这是我问题的解

  • 我试图在屏幕中间构造一个窗口小部件。我没有使用pos_hint或size_hint,因为我将在以后更改小部件的位置,但是当我构建小部件时,它的大小和位置不正确。这是我的密码: 为什么小部件的大小不等于窗口大小的十分之一,为什么它的中心在窗口的右上角?

  • 我在刷新小部件的BoxLayout时遇到了问题,方法是删除它们,然后根据列表“组”重新构建小部件。在EditDeviceGroups屏幕上,“创建”按钮应向列表中添加一个元素,并将用户转发到GroupTemplateScreen,确实如此。 当用户使用“后退”按钮返回到EditDeviceGroups屏幕时,会出现此问题。当时,我认为on_enter方法将刷新小部件以包含新元素,但列表中没有显示任

  • 我在kivy中添加或删除小部件时遇到一些困难。情况就是这样: 主窗体应该包含三个小部件中的两个,即Widget1、Widget2和Widget3。按下Widget1的按钮,Widget2应该被删除,Widget3应该出现。 这是main.py文件: 这是.kv文件: 在类表单中,我检查Widgets1和2是否为该类的子类: 我得到: 因此,当我尝试删除现有子项并添加新子项时,我得到: 有人能帮忙吗