kivy 基础: widget, texture的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kivy 基础: widget, texture的使用相关的知识,希望对你有一定的参考价值。

参考技术A 控件Widget是 Kivy 图形界面中的基本元素。控件提供了一个画布Canvas。

layout = BoxLayout(padding=10)

button = Button(text='My first button')

layout.add_widget(button)

layout 是button的父控件

button是layout的子控件

尝试创建控件

class MyVideoBox(Widget):

    def __init__(self, **kwargs):

        super(MyVideoBox, self).__init__(**kwargs)

        with self.canvas:

            print self.x,self.y,self.width,self.height

加入到GridLayout,放到第四格的位置

class MainScreen(GridLayout):

    def __init__(self,**kwargs):

        super(MainScreen,self).__init__(**kwargs)

        self.cols = 2

        self.add_widget(Button(text="+"));

        self.add_widget(Button(text="+"));

        self.add_widget(Button(text="+"));

        #self.add_widget(Button(text="+"));

        self.add_widget(MyVideoBox())

但是效果是放在左下,而不是layout第四格的位置

打印是0 0 100 100

有点奇怪,为什么不是相对位置呢?

修改一下

self.add_widget(MyVideoBox(pos=(800,0),size=(800,600)))

这下对了

打印是800 0 800 600

接下来为这个widget添加纹理

with self.canvas:

    print self.x,self.y,self.width, self.height

    self._texture = Texture.create(size=self.size)

    self._buffer = '\xf0\x20\x80' * 800 * 600

    self._texture.blit_buffer(self._buffer, colorfmt='rgb', bufferfmt='ubyte')

    Rectangle(pos=self.pos,size=self.size,texture=self._texture)

但是更新内容测试一下,添加按键

def on_touch_down(self, touch):

    print "touched"

    buf = '\x20\xf0\x80' * 800 * 600

    self._texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')

    return super(MyVideoBox, self).on_touch_down(touch)

打印有了,就是内容没变,怎么办?

改变如下

    self._texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')

self.canvas.ask_update()

成功

问题: remove_widget 不起作用

def __init__(self, **kwargs):

    super(MyVideoBox, self).__init__(**kwargs)

with self.canvas:

self.add_widget(self._button)

def on_touch_down(self, touch):

self.remove_widget(self._button)

解决:

移到cavas外面

def __init__(self, **kwargs):

    super(MyVideoBox, self).__init__(**kwargs)

self.add_widget(self._button)

with self.canvas:

def on_touch_down(self, touch):

self.remove_widget(self._button)

这样可以了

Kivy - 按 id 删除小部件

【中文标题】Kivy - 按 id 删除小部件【英文标题】:Kivy - Removing widget by id 【发布时间】:2017-06-29 15:12:21 【问题描述】:

我有以下代码:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout


class GUI(FloatLayout):
    def remove(self):
        self.remove_widget(self.ids.test)


class GUIApp(App):
    def build(self):
        return GUI()


if __name__ == '__main__':
    GUIApp().run()

以及对应的kv文件:

#:kivy 1.9.1

<GUI>:
    BoxLayout:
        Button:
            id: test
            text: 'Test'
            on_press: root.remove()

单击时应删除该按钮。但是,这不会发生。如果我删除 kv 文件中的BoxLayout,程序按预期工作,并且按钮被删除。为什么会发生这种情况,如何删除在 kv 文件中声明的小部件? (我知道我可以用self.parent.remove_widget(self) 替换按钮的on_press,但除了删除小部件之外,我在root.remove() 中有代码。)

【问题讨论】:

【参考方案1】:

当您的按钮的父级实际上是其中的BoxLayout 时,您正在调用GUI 对象的remove_widgetremove_widget 只删除直接子代,不删除任何后代。

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder

Builder.load_string('''
<GUI>:
    BoxLayout:
        id: layout
        Button:
            id: test
            text: 'Test'
            on_press: root.remove()
''')


class GUI(FloatLayout):
    def remove(self):
        self.ids.layout.remove_widget(self.ids.test)


class GUIApp(App):
    def build(self):
        return GUI()


if __name__ == '__main__':
    GUIApp().run()

【讨论】:

以上是关于kivy 基础: widget, texture的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kivy 的时钟从 kivy 文件 (.kv) 访问不同类的 id/widget?

Kivy - AttributeError:“NoneType”对象没有属性“add_widget”

Kivy Image Widget - 模块对象不可调用

将 Kivy Widget 传递给另一个类

如何从 kivy 文件 (.kv) 访问不同类的 id/widget?

如何根据 Widget Kivy 属性更新**动态添加的**椭圆(不使用 Builder)的颜色?