使用自定义小部件Kivy

3

我想构建一个使用自定义小部件的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"

这个功能符合预期,我的按钮基本上占据了整个窗口。然而,当我尝试用我的自定义按钮替换按钮时

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

如何使每个按钮行为不同?

2
可以使用第二种方法...(说实话,我尽可能地避免使用.kv语言,并直接在Python中实现大部分功能) - Joran Beasley
2
@JoranBeasley 为什么你避免使用 kvlang? - Dan Oberlam
我对描述性语言普遍有一种天生的厌恶感(加上在1.8之前,.kv文件中的循环引用存在一些内存泄漏问题)。当我只是在Python中子类化小部件并以这种方式构建我的内容时,我对正在发生的事情有更好的理解。 - Joran Beasley
所有这些都是我的个人意见,但我认为Kivy是跨平台GUI开发的最佳选择(特别是针对平板电脑和手机)。 - Joran Beasley
1个回答

9
你实际的问题是,尽管在kv文件中,MyWidget被放置在BoxLayout中,但其子元素BoxLayout的大小并未设置为MyWidget的大小,因此仍保持默认大小和(100,100)的位置显示在屏幕左下角。
你可以通过添加额外的规则size: root.size来解决这个问题,就像你在<RootWidget>规则中做的那样。实际上,通常更容易使用BoxLayout(即子类化BoxLayout而不是Widget),这当然会自动调整大小/定位。
另外,正如Joran所说,如果你只想在按钮按下时执行某些操作,可以使用第二种方法...这也是你的本意!我不知道你正在查看哪个示例,但通常不需要像你这样复杂的排列方式。
你可能还想知道,在最新版本(1.8)中,按钮的行为已经抽象成一个ButtonBehavior类,用于处理检测触摸和适当地分派on_press等。这个行为不是一个小部件,所以你可以将其与任何其他小部件一起子类化,将其变成按钮!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接