Python 2.7 Kivy-使用Python寻址用KV语言创建的椭圆小部件

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小部件放在布局

我想控制一个使用KV语言在Kivy中创建的简单椭圆小部件。我已经为此工作了好几天,阅读并完成了Roberto Ulloa和Ben Rousch的在线研讨会《Kivy:Interactive Applications in Python》一书中的练习

虽然这些教程中提供的示例在预定义的Kivy小部件(即按钮和标签)上运行良好,但我在控制我定义的小部件(如下面的代码中所示的圆形椭圆)时遇到了问题

在下面的代码中,我在第10行和第45行创建了圆形椭圆类小部件(名为Ball)。我将Ball小部件放在布局上(第29行),然后将小部件标识为我的_圆(第30行)。最后,我提供了将小部件链接到Python的代码(第26行),以便Python代码可以控制小部件

但是,当我按下“收缩圆”按钮并调用收缩圆()函数时,对小部件没有影响。知道代码哪里出错了吗?我很想知道,因为这对我来说已经很神秘了,我找不到任何简单的方法来解释我需要做什么来纠正这个问题

完整代码如下

提前感谢

……布拉德

# 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())

请记住,kivy
canvas
不是一个小部件,也不是您绘制的空间,它只是一组要绘制的指令<代码>球应该是一个小部件

另一方面,如果未禁用
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())