Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用自定义窗口小部件kivy

使用自定义窗口小部件kivy
EN

Stack Overflow用户
提问于 2014-04-01 20:23:35
回答 1查看 11.2K关注 0票数 3

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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教程使用这种方法来制作他们的自定义按钮,但我不能这样做吗

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Button:
    on_press: root.do_action()

让每个按钮都有不同的行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-01 22:32:26

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

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

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

您可能还想知道,在最新的发行版(1.8)中,按钮行为已被抽象为一个ButtonBehavior类,用于适当地处理检测触摸和分派on_press等。该行为不是一个小部件,所以您可以使用任何其他小部件对其进行子类化,以将任何内容转换为按钮!

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22796142

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文