首页 > 解决方案 > Kivy,鼠标周围不透明,显示图片

问题描述

我想制作一个谜题,其中有人必须遵循迷宫并收集必须稍后输入的字母作为答案。(程序不收集,只是记住通过了哪些字母,然后在退出迷宫时输入。)

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.config import Config

Config.set('graphics', 'width', '806')
Config.set('graphics', 'height', '706')

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

    def on_touch_down(self, touch):
        pass

    def on_touch_down(self, touch):
        pass

    def on_touch_down(self, touch):
        pass
    
class MyGrid(GridLayout):
    pass
    
class DrawingWindow(App):
    def build(self):
        return MyGrid()

if __name__ == "__main__":
    DrawingWindow().run()
<MyGrid>:
    
    GridLayout:
        cols:1
        size:1000,706

        canvas:
            
            Rectangle:
                size: 808,706
                source: 'Puzzle.png'

我已经找到了如何在鼠标所在的地方画一个圆圈(没有添加到代码中,因为我认为可能会使用不同的方法),但是如何使某个半径周围的所有东西都变成黑色,这样它只会显示一个小在这个半径内圈。也许在半径内使用不透明度是一种解决方案。如果有人可以将我推向正确的方向,那将非常有帮助。

它不必保持公开,而不是实际上。希望这也让它变得更容易一些。

我希望我已经清楚地说明了问题所在。提前感谢您的时间和精力。

标签: pythonkivy

解决方案


您可以使用Stencil Instructions来完成此操作。这是一个简单的例子:

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.properties import NumericProperty, ListProperty
from kivy.uix.widget import Widget

kv = '''
RelativeLayout:
    ImageWithHole:
        id: hole
        canvas:
            StencilPush
            Ellipse:  # draw the hole
                pos: self.hole_pos[0] - self.radius, self.hole_pos[1] - self.radius
                size: self.radius*2, self.radius*2
            StencilUse
            Color:
                rgba: 1,1,1,1
            Rectangle:
                source: 'Puzzle.png'  # draw the maze
                pos: 0,0
                size: self.size
            StencilUnUse
            Ellipse:  # erase the hole (must be identical to original draw above)
                pos: self.hole_pos[0] - self.radius, self.hole_pos[1] - self.radius
                size: self.radius*2, self.radius*2
            StencilPop
'''


class ImageWithHole(Widget):
    radius = NumericProperty(50)
    hole_pos = ListProperty([400, 300])


class TestApp(App):
    def build(self):
        Window.bind(mouse_pos=self.on_motion)
        return Builder.load_string(kv)

    def on_motion(self, src, mouse_pos):
        hole = self.root.ids.hole
        hole.hole_pos = mouse_pos

TestApp().run()

推荐阅读