【问题标题】:removing Images on clicks in kivy删除 kivy 中点击时的图像
【发布时间】:2015-04-16 22:54:12
【问题描述】:

我正在尝试用 kivy 制作一个基本的隐藏对象游戏,但由于我是新手,所以有点难。所以我所做的是使用 flowLayout 的画布显示了 4 张图像,现在我希望它们在单击 ON THEM 后消失。我应该怎么做,最好的方法是什么???

还有一件事,我想要一个标签来显示倒计时。我已经放置了一个标签,但它不起作用。所以我暂时把它注释掉了。如果有人可以请解释我哪里出错了。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.image import Image
from kivy.config import Config
from kivy.clock import Clock
from kivy.properties import StringProperty
from kivy.graphics.instructions import InstructionGroup
from kivy.graphics.context_instructions import Color

import random

Config.set('graphics', 'width', '480')
Config.set('graphics', 'height', '320')


running= True


class MyWidget(AnchorLayout):
    time_number = StringProperty()

    def __init__(self, **kwargs):
        super(MyWidget, self).__init__(**kwargs)
        self.time_number = str(50)
    def call(self):
        if running:
            #print(self.time_number)
            #self.time_number = str(int(self.time_number)+1)
            pass            
    def clicked(self):
        global running
        #self.time_number = 50
        running=False

    Clock.schedule_interval(call, 1)

    pos1 =(0) #random.randint(-200,200)
    pos2 =(0) #random.randint(-200,200)

class WidgetsApp(App):
    def build(self):
        return MyWidget()


if __name__=="__main__":
    WidgetsApp().run()

.kv 文件

<MyWidget>
    AnchorLayout:
        BoxLayout:           
            Image:
                source:'B_image.png'
        BoxLayout:

            Label:
                text:root.time_number
        FloatLayout:
            canvas:
                Rectangle:
                    pos:(root.pos1,root.pos2)
                    size: 24, 24
                    source:'image.png'
                Rectangle:
                    pos:(root.pos1 + 100,root.pos2)
                    size: 24, 24
                    source:'image.png'
                Rectangle:
                    pos:(root.pos1,root.pos2 + 100)
                    size: 24, 24
                    source:'image.png'
                Rectangle:
                    pos:(root.pos1 + 100,root.pos2 + 100)
                    size: 24, 24
                    source:'image.png'

【问题讨论】:

  • 你应该把这篇文章分成两个单独的问题,因为你在这篇文章中问了两个问题。

标签: python-3.x kivy


【解决方案1】:

对于每个矩形,将 on_press 属性设置为从其父窗口小部件中移除矩形窗口小部件的函数。如:

<MyWidget>:
    grid_layout: grid_layout
    AnchorLayout:
        BoxLayout:
            Image:
                source:'B_image.png'
        BoxLayout:
            Label:
                text:root.time_number
        GridLayout:
            rows: 2
            id: grid_layout
            Button:
                background_normal: 'image.png'
                on_press: root.remove_rectangle(widget=self)
            Button:
                background_normal: 'image.png'
                on_press: root.remove_rectangle(widget=self)
            Button:
                background_normal: 'image.png'
                on_press: root.remove_rectangle(widget=self)
            Button:
                background_normal: 'image.png'
                on_press: root.remove_rectangle(widget=self)

在 main.py 中:

class MyWidget(AnchorLayout):
    ...
    def remove_rectangle(self, widget):
        self.grid_layout.remove_widget(widget)

【讨论】:

  • 函数没有被调用,我尝试添加上面的但它没有工作。然后我在 remove_rectangle() 函数中添加了一条打印语句,这样我就知道单击时它是否被调用,但是一旦我运行它并单击图像它没有做任何事情。
  • 编辑了我的回复。矩形实际上需要是一个 Button 或子类 Button,因此它具有 on_press 属性。这是因为要让矩形在您“单击它们”后做出响应,它们需要具有 Button 属性。另外,请注意 background_normal 属性。
  • 现在我得到这个错误 kivy.lang.ParserException: Parser: File "/home/nabeel/Desktop/widgets.kv", line 11: ... 9: value:root. time_number 10:>> 11:float_layout:float_layout 12:13:FloatLayout:...声明后无效数据我尝试删除“float_layout:float_layout”,但点击后它只是崩溃并出现错误
  • 发布完整的回溯,例如使用 gist。
  • 查看编辑后的代码。这将使您的按钮消失。不过,您需要调整它们的定位和尺寸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2021-02-25
  • 2017-11-14
  • 2017-04-03
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多