Python 使用定制小部件kivy

Python 使用定制小部件kivy,python,python-2.7,button,kivy,Python,Python 2.7,Button,Kivy,我正在尝试使用一些自定义小部件构建一个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):

我正在尝试使用一些自定义小部件构建一个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"

要使每个按钮的行为不同?

您的实际问题是,尽管您的
MyWidget
被放置在kv文件的
BoxLayout
中,但其子
BoxLayout
的大小没有设置为
MyWidget
大小,因此只保留
的默认大小和位置(100100)
位于屏幕左下角

您可以通过使用额外的
size:root.size
规则来解决这个问题,就像您在
规则中所做的那样,或者实际上更容易使用BoxLayout(即子类
BoxLayout
而不是
小部件
),这当然会免费为您提供自动调整大小/定位的功能

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


您可能还想知道,在最新版本(1.8)中,按钮行为被抽象为一个
ButtonBehavior
类,该类处理检测触摸和在按下按钮时发送
等操作。该行为不是一个小部件,因此您可以将其与任何其他小部件子类化,以使任何内容成为按钮

是的,你可以用第二种方法。。。(tbh我喜欢尽量避免使用.kv语言,并直接用python实现大部分内容)@JoranBeasley为什么要避免使用kvlang?我只是对一般的描述性语言有一种天生的厌恶感(加上在1.8之前,.kv文件中有一些循环引用的内存泄漏)当我只是在python中对widget进行子类并以此方式构建我的东西时,我对所发生的事情有了更好的理解。所有这些都表明imho Kivy是实现跨平台gui的方法(尤其是针对平板电脑和手机)
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:
Button:
    on_press: root.do_action()