使用自定义小部件 kivy

Posted

技术标签:

【中文标题】使用自定义小部件 kivy【英文标题】:Use custom widgets kivy 【发布时间】:2014-05-12 19:58:52 【问题描述】:

我正在尝试使用一些自定义小部件构建一个 kivy 应用程序。但是,每当我尝试使用它们时,它们都不会与我的布局一起使用。使用普通按钮:

import kivy
kivy.require('1.8.0')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ListProperty

class RootWidget(Widget):pass

class myApp(App):

    def build(self):
        global rw
        rw  = RootWidget()
        return rw

if __name__ == '__main__':
    myApp().run()

#:kivy 1.8.0

<RootWidget>:

    BoxLayout:
        size: root.size
        orientation: 'horizontal'
        spacing: 10
        padding: 10

        Button:
            id: abut
            text: "Custom Button"

这按预期工作,我的 Button 基本上占据了整个窗口。但是,当我尝试用我的自定义按钮替换 Button 时

import kivy
kivy.require('1.8.0')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ListProperty

class MyWidget(Widget):

     pressed = ListProperty([0, 0])

     def on_touch_down(self, touch):
         if self.collide_point(*touch.pos):
             self.pressed = touch.pos
             return True
         return super(MyWidget, self).on_touch_down(touch)

     def on_pressed(self, instance, pos):
         print ('pressed at pos'.format(pos=pos))

class RootWidget(Widget):pass

class someApp(App):

    def build(self):
        global rw
        rw  = RootWidget()
        return rw

if __name__ == '__main__':
    someApp().run()

#:kivy 1.8.0

<MyWidget>:
    BoxLayout:
        orientation: 'horizontal'
        spacing: 10

        Button:
            id: abut
            text: "Custom Button"        

<RootWidget>:

    BoxLayout:
        size: root.size
        orientation: 'horizontal'
        spacing: 10
        padding: 10

        MyWidget:

它只出现在窗口的左下角,不像一个按钮。我错过了什么?

此外,是否有必要以这种方式创建自定义按钮? kivy 教程使用这种方法来制作他们的自定义按钮,但我不能只做这样的事情

Button:
    on_press: root.do_action()

让每个按钮的行为不同?

【问题讨论】:

是的,你可以只做第二种方法......(我喜欢尽可能避免使用 .kv 语言并直接在 python 中实现大部分这些东西) @JoranBeasley 为什么要避免使用 kvlang? 我只是对一般的描述性语言有一种自然的反感(加上在 1.8 之前,.kv 文件中存在循环引用的一些内存泄漏)我更好地理解当我只是子类小部件时发生的事情python 并以这种方式构建我的东西 所有说 imho Kivy 是做跨平台 gui 东西的方式(尤其是针对平板电脑和手机) 【参考方案1】:

您的实际问题是,尽管您的MyWidget 被放置在 kv 文件中的 BoxLayout 中,但它的子 BoxLayout 确实 not 将其大小设置为 MyWidget 大小,因此只在屏幕左下角保持(100, 100) 的默认大小和位置。

你可以通过给它额外的size: root.size 规则来解决这个问题,就像你在&lt;RootWidget&gt; 规则中所做的那样,或者实际上通常使用BoxLayout 更容易(即子类BoxLayout 而不是Widget)课程免费为您提供自动调整大小/定位。

另外,正如 Joran 所说,如果您只是想在按下按钮时做某事,您可以使用第二种方法……这就是您想要做的!我不知道你在看什么例子,但你通常不需要像你这样的复杂安排。

您可能还想知道,在最新版本 (1.8) 中,按钮行为已被抽象为 ButtonBehavior 类,该类处理检测触摸和适当地调度 on_press 等。 Behavior 不是小部件,因此您可以将其与任何其他小部件子类化以将任何东西变成按钮!

【讨论】:

以上是关于使用自定义小部件 kivy的主要内容,如果未能解决你的问题,请参考以下文章

在 Kivy 中使用 RecycleView 的自定义小部件的对齐问题

如何在kivy中正确导入自定义小部件

带有 kivy 语言和自定义小部件的 Kivy 滚动视图

Kivy:如何使小部件表现得像溢出:隐藏

如何获取在kivy中定义在屏幕小部件内的滑块的值

在子小部件中,如何在 kivy 中获取父小部件的实例