kivy 基础: widget, texture的使用

控件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 基础: widget, texture的使用)