Kivy支持完全使用代码创建界面布局和控件,最近也刚刚推出2.0版。使用的时候,发现新版跟旧版有一处差异:
import kivy
kivy.require('2.0.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
label = Label(id='mouse_label',
text='pos~~~',
pos=(0, 0),
width='50dp',
height='20dp',
font_size=12,
bold=True,
color=(0.1, 0.1, 0.1, 1),
outline_width=1,
outline_color=(1, 1, 1)
)
return label
if __name__ == '__main__':
MyApp().run()
上面把官网文档的示例代码稍作改动,增加了初始化Label的很多属性,在1.x版本中可以正常运行。但升级到2.0版,就会报错:
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
这是个经典的Kivy报错,也非常诡异,完全不能理解——明明Label类的构造函数,可以接收多个参数么!即使调试进去,也看不出问题所在,只知道是调用父类的父类的(没看错,就是两级父类,指向WidgetBase)构造函数出错的。不过既然实例代码能用,问题肯定出在我补充的参数上,本来以为是哪个样式被废弃了,结果试来试去,发现竟然是id !?
只要把id='mouse_label'
这行删掉,一切就恢复正常了,为什么暂时还不知。最终成功运行的代码如下:
import kivy
kivy.require('2.0.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
label = Label(
text='pos~~~',
pos=(0, 0),
width='50dp',
height='20dp',
font_size=12,
bold=True,
color=(0.1, 0.1, 0.1, 1),
outline_width=1,
outline_color=(1, 1, 1)
)
return label
if __name__ == '__main__':
MyApp().run()
运行效果