【问题标题】:Kivy - Addressing An Ellipse Widget Created In KV Language Using PythonKivy - 使用 Python 处理用 KV 语言创建的椭圆小部件
【发布时间】:2017-07-20 14:36:25
【问题描述】:

我想控制一个使用 KV 语言在 Kivy 中创建的简单 Ellipse 小部件。我已经阅读并完成了 Roberto Ulloa 和 Ben Rousch 在https://bradfortner.wordpress.com/2017/07/19/good-kivy-tutorial/ 的在线研讨会所著的 Kivy:Python 中的交互式应用程序一书中的练习。

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

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

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

完整代码如下。

提前表示感谢。

....布拉德....

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

【问题讨论】:

    标签: python-2.7 kivy kivy-language


    【解决方案1】:

    请记住,kivy canvas 不是一个小部件,也不是您绘画的空间,它只是一个一组说明 来绘制。 Ball 应该是一个小部件。

    另一方面,如果size_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()            
    ''')
    

    输出:

    【讨论】:

      【解决方案2】:

      现在谜团已经解决,为了完成这个问题,我在下面发布了完整的工作代码。我还在这个更新的代码中添加了位置更改,以便将来看到此内容的人也知道如何编写位置更改代码。

      也要公平对待在 Ben Rousch 的在线研讨会上撰写 Kivy:Python 中的交互式应用程序的 Roberto Ulloa;

      • Ulloa 的书确实解决了 FJSevella 在上述代码中更正的小部件寻址问题。虽然他的书很好,但 Ulloa 可能在单个章节中使用了多个 .kv 文件,这让我感到困惑。我认为寻址 () 被用于引用不同的 .kv 文件。
      • Rousch 的在线研讨会并未涉及 Kivy 的画布,尽管我已经多次阅读了关于 Kivy 画布的 10 件你应该知道的事情,但我正试图将我的大脑包裹起来。 (http://robertour.com/2013/07/19/10-things-you-should-know-about-the-kivy-canvas/)。

      下面是完整的工作代码;

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        • 2015-08-29
        • 1970-01-01
        相关资源
        最近更新 更多