python - kivy 圆形菜单

标签 python kivy

我想用 Kivy 写一个圆形菜单。最后它应该看起来像这样:

enter image description here

我在早期就偶然发现了一些问题。我已经创建了“主菜单”按钮(0.1)。现在我想创建 2 个新的菜单圈 2.1 + 2.2。问题是,当我单击主按钮时,两个新按钮的事件发生,但单击新按钮没有任何反应。
我真的很感谢任何帮助。 :)

菜单.py

import kivy
kivy.require('1.8.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
from kivy.factory import Factory
from kivy.uix.scatter import Scatter
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout

from kivy.lang import Builder

class menuApp(App):
    print "test"
    def secTouch(self):
        print "sectouch"


class RootWidget(FloatLayout):
pass


class Menu (FloatLayout):
def newMenu(self):
    dynamicMenu = Factory.First()
    self.add_widget(dynamicMenu)
    pass

class First(Scatter):

    def firstTouch(self):
        dynamicWidget = Factory.Second()
        self.add_widget(dynamicWidget)    
    print "touch"
    pass

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

菜单.kv

#:kivy 1.8.0
#: set buttonSize 100, 100
#: set middleOfScreen 0,0

RootWidget:
<RootWidget>:
    Menu

<Menu>
    on_touch_down: root.newMenu()

<First>:
    id: first
    pos: root.size[0]/2-self.size[0]/2, root.size[1]/2-self.size[1]/2
    size: 100, 100
size_hint: None, None
Widget:
    on_touch_down: root.firstTouch()
    id: me
    size_hint: None, None
    size: 100, 100
    pos: root.size[0]/2-self.size[0]/2, root.size[1]/2-self.size[1]/2

    canvas:
        Color:
            rgb: 1, 0, 0
        Ellipse:
            pos: me.pos
            size: buttonSize


<Second@Scatter>:
pos: root.size[0]/2-self.size[0]/2+40, root.size[1]/2-self.size[1]/2+40
size: 100, 100
size_hint: None, None
on_touch_down: app.secTouch()
canvas:
    Color:
        rgb: 1, 0, 0
    Ellipse:
        pos: root.size[0]/2-self.size[0]/2+40, root.size[1]/2-self.size[1]/2+40
        size: buttonSize

最佳答案

每个触摸事件都会分派(dispatch)到 on_touch_down 事件处理程序,而不仅仅是给定区域(小部件内)的触摸。每次触摸屏幕时,无论在何处,Menuon_touch_down 都会被触发。您应该使用 collide_point() 来确保触摸在给定的边界内。

Grabbing Touch Events Kivy 指南的部分有一个 collide_point() 示例,以及一些有关触摸事件的一般信息。

但是,基本思想:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
        # do stuff here
        return True  # 'handle' the event so it will not propagate

关于python - kivy 圆形菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23874713/

相关文章:

python - 如果 ID 出现多次,Pandas 选择行

android - Kivy Buildozer 无法构建 apk,命令失败 : ./distribute.sh -m "kivy"d

android - 编译Kivy项目并使用Android模拟器运行

python - 在存储在谷歌驱动器中的谷歌 Colaboratory 中导入 zip 文件

python - Flask URL 路由 : Route All other URLs to some function

python - Kivy 在移动时获取 Widget 在 Scatter 中的位置

python - 为什么我无法使用 pip 安装 kivy-garden/garden.matplotlib?

python - 带框布局的 kivy ScrollView

python - 最小索引内置函数

python - 按属性过滤