Python 2.7 Kivy-使用Python寻址用KV语言创建的椭圆小部件
我想控制一个使用KV语言在Kivy中创建的简单椭圆小部件。我已经为此工作了好几天,阅读并完成了Roberto Ulloa和Ben Rousch的在线研讨会《Kivy:Interactive Applications in Python》一书中的练习 虽然这些教程中提供的示例在预定义的Kivy小部件(即按钮和标签)上运行良好,但我在控制我定义的小部件(如下面的代码中所示的圆形椭圆)时遇到了问题 在下面的代码中,我在第10行和第45行创建了圆形椭圆类小部件(名为Ball)。我将Ball小部件放在布局上(第29行),然后将小部件标识为我的_圆(第30行)。最后,我提供了将小部件链接到Python的代码(第26行),以便Python代码可以控制小部件 但是,当我按下“收缩圆”按钮并调用收缩圆()函数时,对小部件没有影响。知道代码哪里出错了吗?我很想知道,因为这对我来说已经很神秘了,我找不到任何简单的方法来解释我需要做什么来纠正这个问题 完整代码如下 提前感谢 ……布拉德Python 2.7 Kivy-使用Python寻址用KV语言创建的椭圆小部件,python-2.7,kivy,kivy-language,Python 2.7,Kivy,Kivy Language,我想控制一个使用KV语言在Kivy中创建的简单椭圆小部件。我已经为此工作了好几天,阅读并完成了Roberto Ulloa和Ben Rousch的在线研讨会《Kivy:Interactive Applications in Python》一书中的练习 虽然这些教程中提供的示例在预定义的Kivy小部件(即按钮和标签)上运行良好,但我在控制我定义的小部件(如下面的代码中所示的圆形椭圆)时遇到了问题 在下面的代码中,我在第10行和第45行创建了圆形椭圆类小部件(名为Ball)。我将Ball小部件放在布局
# Modified from https://github.com/brousch/pyohio-kivy-tutorial/blob/master/tutorial/step11_tts/saythis.kv
import kivy
from kivy.lang import Builder
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
kivy.require("1.9.1")
Builder.load_string('''
<Ball>:
size: 1, 1
canvas:
Color:
rgba: 1, 1, 1, 1
Ellipse:
pos: 350,290
size: 70,70
<ShrinkThis>:
button_font_size: '30sp'
canvas:
Color:
rgba: 0, 0, 0, 1
Rectangle:
pos: self.pos
size: self.size
my_circle: my_circle
BoxLayout:
orientation: 'horizontal'
Ball:
id: my_circle
Button:
text: 'Shrink Circle'
font_size: root.button_font_size
size_hint: 1, None
on_press: root.shrink_circle()
''')
class ShrinkThis(BoxLayout):
my_circle = ObjectProperty(None)
def shrink_circle(self):
self.my_circle.size = (10,10)
class Ball(Widget):
pass
class ShrinkThisApp(App):
def build(self):
return ShrinkThis()
if __name__ == '__main__':
ShrinkThisApp().run()
#修改自https://github.com/brousch/pyohio-kivy-tutorial/blob/master/tutorial/step11_tts/saythis.kv
进口克维
从kivy.lang导入生成器
从kivy.app导入应用程序
从kivy.properties导入ObjectProperty
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.widget导入widget
kivy.require(“1.9.1”)
Builder.load_字符串(“”)
:
尺寸:1,1
画布:
颜色:
rgba:1,1,1,1
椭圆:
位置:350290
尺码:70,70
:
按钮字体大小:“30sp”
画布:
颜色:
rgba:0,0,0,1
矩形:
pos:self.pos
大小:self.size
我的圈:我的圈
盒子布局:
方向:“水平”
球:
我的圆圈
按钮:
文本:“收缩圆”
字体大小:root.button\u字体大小
大小提示:1,无
按上:根。收缩圆()
''')
类收缩此(BoxLayout):
my_circle=ObjectProperty(无)
def收缩_圆(自):
self.my_circle.size=(10,10)
类球(小部件):
通过
类ShrinkThisApp(应用程序):
def生成(自):
return ShrinkThis()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
ShrinkThisApp().run())
请记住,kivycanvas
不是一个小部件,也不是您绘制的空间,它只是一组要绘制的指令<代码>球应该是一个小部件
另一方面,如果未禁用size\u hint
属性,则忽略size
属性
简化示例:
import kivy
kivy.require("1.9.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
Builder.load_string('''
<Ball@Widget>
size: 70, 70
pos: 350,290
size_hint: None, None
canvas:
Color:
rgba: 1, 1, 1, 1
Ellipse:
pos: self.pos
size: self.size
<ShrinkThis>:
button_font_size: '30sp'
my_circle: my_circle
Ball:
id: my_circle
Button:
text: 'Shrink Circle'
font_size: root.button_font_size
size_hint: 1, None
on_press: root.shrink_circle()
''')
导入kivy
kivy.require(“1.9.1”)
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.properties导入ObjectProperty
从kivy.uix.floatlayout导入floatlayout
Builder.load_字符串(“”)
尺码:70,70
位置:350290
大小提示:无,无
画布:
颜色:
rgba:1,1,1,1
椭圆:
pos:self.pos
大小:self.size
:
按钮字体大小:“30sp”
我的圈:我的圈
球:
我的圆圈
按钮:
文本:“收缩圆”
字体大小:root.button\u字体大小
大小提示:1,无
按上:根。收缩圆()
''')
输出:
import kivy
kivy.require("1.9.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
Builder.load_string('''
<Ball@Widget>
size: 70, 70
pos: 350,290
size_hint: None, None
canvas:
Color:
rgba: 1, 1, 1, 1
Ellipse:
pos: self.pos
size: self.size
<ShrinkThis>:
button_font_size: '30sp'
my_circle: my_circle
Ball:
id: my_circle
Button:
text: 'Shrink Circle'
font_size: root.button_font_size
size_hint: 1, None
on_press: root.shrink_circle()
''')
现在谜团已经解开,为了完成这个问题,我在下面发布了完整的工作代码。我还将职位变更添加到更新后的代码中,以便将来看到这一点的人也知道如何为职位变更编写代码 为了公平起见,Roberto Ulloa在Ben Rousch的在线研讨会上编写了《Kivy:Python交互式应用程序》
- Ulloa的书确实解决了FJSevella在上述代码中更正的小部件寻址问题。虽然他的书很好,但乌洛亚可能在一章中使用了太多的.kv文件,这让我感到困惑。我认为addressing()用于引用不同的.kv文件
- Rousch的在线研讨会没有涉及Kivy的画布,这是另一件我正在绞尽脑汁思考的事情,尽管我已经多次阅读了关于Kivy画布的10件事情。()
# Modified from https://github.com/brousch/pyohio-kivy-tutorial/blob/master/tutorial/step11_tts/saythis.kv
# And https://stackoverflow.com/questions/45217816/kivy-addressing-an-ellipse-widget-created-in-kv-language-using-python
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
kivy.require("1.9.1")
Builder.load_string('''
<Ball@Widget>
size: 70, 70
pos: 350,290
size_hint: None, None
canvas:
Color:
rgba: 1, 1, 1, 1
Ellipse:
pos: self.pos
size: self.size
<ShrinkThis>:
button_font_size: '30sp'
my_circle: my_circle
Ball:
id: my_circle
Button:
text: 'Shrink & Reposition Circle'
font_size: root.button_font_size
size_hint: 1, None
on_press: root.shrink_reposition_circle()
''')
class ShrinkThis(FloatLayout):
my_circle = ObjectProperty(None)
def shrink_reposition_circle(self):
self.my_circle.size = (10,10)
self.my_circle.pos = (300, 500)
class Ball(Widget):
pass
class ShrinkThisApp(App):
def build(self):
return ShrinkThis()
if __name__ == '__main__':
ShrinkThisApp().run()
#修改自https://github.com/brousch/pyohio-kivy-tutorial/blob/master/tutorial/step11_tts/saythis.kv
#及https://stackoverflow.com/questions/45217816/kivy-addressing-an-ellipse-widget-created-in-kv-language-using-python
进口克维
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.floatlayout导入floatlayout
从kivy.properties导入ObjectProperty
从kivy.uix.widget导入widget
kivy.require(“1.9.1”)
Builder.load_字符串(“”)
尺码:70,70
位置:350290
大小提示:无,无
画布:
颜色:
rgba:1,1,1,1
椭圆:
pos:self.pos
大小:self.size
:
按钮字体大小:“30sp”
我的圈:我的圈
球:
我的圆圈
按钮:
文本:“收缩并重新定位圆”
字体大小:root.button\u字体大小
大小提示:1,无
按下:根。收缩\u重新定位\u圆()
''')
类收缩此(浮动布局):
my_circle=ObjectProperty(无)
def收缩\重新定位\圆(自):
self.my_circle.size=(10,10)
self.my_circle.pos=(300500)
类球(小部件):
通过
类ShrinkThisApp(应用程序):
def生成(自):
return ShrinkThis()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
ShrinkThisApp().run())