控件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)
这样可以了