Skip to main content
 首页 » 编程设计

python之使用自定义小部件 kivy

2025年05月04日8shanyou

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

让每个按钮的行为不同?

请您参考如下方法:

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

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

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

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