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_widget
。 remove_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”