use*_*784 2 python drawing python-2.7 kivy
我刚开始和Kivy一起开始,这与我以前的习惯有所不同,如果我犯了愚蠢的错误,我道歉!
现在我正在尝试创建一个执行以下操作的应用程序:
到目前为止,我已经实现了第一次,第二次.
现在我的拖动效果不太好.如果我移动鼠标太快,它会取消移动方法(因为它不再接触).有没有更好的方法来产生拖动或者我只是提高刷新率(如果是这样的话?).
def on_touch_move(self, touch):
if self.collide_point(touch.x, touch.y):
self.pos=[touch.x-25, touch.y-25]
Run Code Online (Sandbox Code Playgroud)
我尝试使用Buttons,使用on_press方法更好地跟踪移动.但是现在我很难更新按钮的位置(主要是语法).
class GraphNode(Button):
background_disabled_down=1
background_disabled_normal=1
def moveNode(self):
with touch:
self.pos=[touch.x-25, touch.y-25]
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用触摸值,并不断收到一系列错误.(显然目前的尝试不起作用,我只是觉得这很有趣).
你可能会说,我也不知道如何摆脱按钮图形,因为我想使用椭圆.如果有人可以告诉我如何在按钮上更改椭圆的颜色,这将是一个额外的好处,这将是很酷的!
kv文件:
<GraphNode>:
size: 50, 50
canvas:
Ellipse:
pos: self.pos
size: self.size
on_press:
root.moveNode()
Run Code Online (Sandbox Code Playgroud)
我希望能够使用触摸信息更新位置,但不知道如何在此处实现.
完整的核心python代码:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import NumericProperty, ReferenceListProperty,\
ObjectProperty
from kivy.graphics import Color, Ellipse, Line
class GraphInterface(Widget):
node = ObjectProperty(None)
class GraphApp(App):
def build(self):
node = GraphNode()
game = GraphInterface()
createNodeButton = Button(text = 'CreateNode', pos=(100,0))
createEdgeButton = Button(text = 'CreateEdge')
game.add_widget(createNodeButton)
game.add_widget(createEdgeButton)
def createNode(instance):
game.add_widget(GraphNode())
print "Node Created"
def createEdge(instance):
game.add_widget(GraphEdge())
print "Edge Created"
createNodeButton.bind(on_press=createNode)
createEdgeButton.bind(on_press=createEdge)
return game
class GraphNode(Button):
def moveNode(self):
with touch:
self.pos=[touch.x-25, touch.y-25]
#def onTouchMove(self, touch):
# if self.collide_point(touch.x, touch.y):
# self.pos=[touch.x-25, touch.y-25]
pass
class GraphEdge(Widget):
def __init__(self, **kwargs):
super(GraphEdge, self).__init__(**kwargs)
with self.canvas:
Line(points=[100, 100, 200, 100, 100, 200], width=1)
pass
if __name__ == '__main__':
GraphApp().run()
Run Code Online (Sandbox Code Playgroud)
如果您需要任何其他信息,或任何不清楚的地方,请告诉我!
编辑:第二个问题转移到:在Kivy中创建一个动态绘制的线.
首先,您应该阅读Kivy中的触摸事件.这里特别感兴趣的是抓住触摸事件的部分.基本上,您可以"抓住"触摸以确保抓取窗口小部件始终从该触摸接收更多事件 - 换句话说,触摸事件之后on_touch_move和on_touch_up之后将发送到您的窗口小部件.
基本示例:
class MyWidget(Widget):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
touch.grab(self)
# do whatever else here
def on_touch_move(self, touch):
if touch.grab_current is self:
# now we only handle moves which we have grabbed
def on_touch_up(self, touch):
if touch.grab_current is self:
touch.ungrab(self)
# and finish up here
Run Code Online (Sandbox Code Playgroud)
但是,甚至更好!如果你想能够拖动小部件,Kivy已经拥有:Scatter.
只需将您的小部件包装在一个中Scatter,您就可以拖动它.您也可以使用多点触控旋转和缩放a Scatter,但您可以轻松禁用它(kv):
FloatLayout:
Scatter:
do_scale: False
do_rotation: False
MyWidget:
Run Code Online (Sandbox Code Playgroud)
旁注 - 这是不正确的:
class GraphNode(Button):
background_disabled_down=1
background_disabled_normal=1
Run Code Online (Sandbox Code Playgroud)
background_disabled_down并且background_disabled_normal是Kivy属性 - 您应该设置这些值__init__.
强制这些值:
class GraphNode(Button):
def __init__(self, **kwargs):
super(GraphNode, self).__init__(background_disabled_down='',
background_disabled_normal='', **kwargs)
Run Code Online (Sandbox Code Playgroud)
建议这些值(更好的选择):
class GraphNode(Button):
def __init__(self, **kwargs):
kwargs.setdefault('background_disabled_down', '')
kwargs.setdefault('background_disabled_normal', '')
super(GraphNode, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)
最后,请注意这些属性是指向用于禁用的图像的文件名Button.如果删除这些值并禁用按钮,则不会绘制任何背景.