我想用 Kivy 写一个圆形菜单。最后它应该看起来像这样:
我在早期就偶然发现了一些问题。我已经创建了“主菜单”按钮(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
事件处理程序,而不仅仅是给定区域(小部件内)的触摸。每次触摸屏幕时,无论在何处,Menu
的 on_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/