使用自定义小部件kivy

2024-07-08 11:10:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

使每个按钮的行为不同?


Tags: fromposimportselfappreturndefbutton
1条回答
网友
1楼 · 发布于 2024-07-08 11:10:08

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

你可以通过给它一个额外的size: root.size规则来解决这个问题,就像你在<RootWidget>规则中所做的那样,或者实际上更容易使用BoxLayout(即子类BoxLayout,而不是Widget),这当然会给你免费的自动调整大小/定位。

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

您可能还想知道,在最新的发行版(1.8)中,按钮行为被抽象为一个ButtonBehavior类,该类可以适当地处理检测触摸和调度on_press等操作。该行为不是小部件,因此您可以将其与任何其他小部件子类化,以便将任何内容生成按钮!

相关问题 更多 >

    热门问题