一、安装 Kivy
pip install kivy
或者
python -m pip install kivy
若安装失败,也要更新pip(下方)再重新安装
二、创建虚拟环境(可选)
virtualenv 虚拟环境安装方法、virtualenv 官方文档
1.更新 pip
"(python位置)···\···\python.exe" -m pip install --upgrade pip
2.安装 virtualenv
在命令窗口里进入虚拟环境的保存路径(自己创建文件夹),如pythonVirtualenv
为保存虚拟环境的文件夹,则
D:\pythonVirtualenv
进入路径后输入
virtualenv -p "(python位置)···\···\python.exe" testEnvrms
其中 testEnvrms
为虚拟环境的名称(自己定义)
3.激活 virtualenv
环境路径 + Scripts\activate,如
D:\pythonVirtualenv\testEnvrms\Scripts\activate
4.退出 virtualenv
在命令行输入
deactivate
三、测试 Kivy
(我目前的kivy版本为v2.1.0)
Kivy官方示例文档
from kivy.app import App
from kivy.uix.label import Label
class TestApp(App):
def build(self):
return Label(text='hello world')
if __name__ == '__main__':
TestApp().run()
结果四、python 使用 kv语言
kv 详细文档
(一)引用kv文件
命名规则:继承了App的类名,且除去 'App'
三个字母的小写再 + '.kv'。如 class MyApp(App)
的kv文件为 my.kv
、class TestApp(App)
的kv文件为 test.kv
。
kv文件命名方式官方文档
有两种方法可以将 Kv 代码加载到您的应用程序中:
- 按名称约定:
Kivy 查找与您的 App 类同名的小写 Kv 文件,如果它以 'App' 结尾,则减去“App”,例如:
MyApp -> my.kv
如果此文件定义了一个Root Widget,它将附加到 App 的root 属性并用作应用程序小部件树的基础。- Builder:您可以告诉 Kivy 直接加载字符串或文件。如果此字符串或文件定义了根小部件,它将由以下方法返回:
Builder.load_file('path/to/file.kv')
或者:
Builder.load_string(kv_string)
情况①:若py文件和kv文件在同一目录文件夹下,可直接使用kv文件(不用添加Builder)
main.py
from kivy.app import App
# 类名为 MyApp
class MyApp(App):
pass
if __name__ == '__main__':
MyApp().run()
my.kv(对应的类名为 MyApp)
#:kivy 2.1.0
BoxLayout:
# 若不需要 Button 的底纹,可添加:background_normal: ''
Button:
text: "yesssssssss!"
background_color: 0, 0.5, 0.6, 0.5
Button:
text: "nooooooo!"
background_color: 0, 0.3, 0.9, 0.5
结果情况②:若py文件和kv文件在不在同一目录下,需要加Builder导入
Builder官方文档
main.py
from kivy.app import App
from kivy.lang import Builder
class MyApp(App):
def build(self):
# 此为相对路径,也可以使用绝对路径
return Builder.load_file(r"kvfiles\my.kv")
if __name__ == '__main__':
MyApp().run()
my.kv
#:kivy 2.1.0
FloatLayout:
# 若不需要 Button 的底纹,可添加:background_normal: ''
Button:
text: "hello world"
background_color: 0, 0.2, 0.65, 0.5
结果情况③:若需要在python里使用自定义的小部件类,则需在kv文件里加上 <自定义的类名>:
"一个类规则,由< >之间的小部件类的名称声明,后跟:,定义该类的任何实例的外观和行为"
<MyWidget>:
main.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
# 重新定义一个 BoxLayout ,类名为 TestLayout
class TestLayout(BoxLayout):
# 若没有逻辑代码直接pass
# pass
def doSomething(self):
print("dosomething")
class TestApp(App):
Builder.load_file(r"kvfiles\test.kv")
def build(self):
return TestLayout()
if __name__ == '__main__':
TestApp().run()
test.kv(自定义的类名"<TestLayout>")
#:kivy 2.1.0
<TestLayout>:
Button:
text: "one btn"
background_color: 0, 0.6, 0.9, 0.5
Button:
text: "two btn"
background_color: 0, 0.4, 0.3, 0.5
结果(二)kv文件里的控件绑定事件
事件绑定官方文档
您还可以on_
在您的 kv 语言中处理事件。例如,TextInput 类有一个focus属性,其自动生成的on_focus
事件可以在 kv 语言中访问,如下所示:TextInput: on_focus: print(args)
如果需要在kv文件里绑定python里的方法,可以加上关键字:
Kv 语言特有的三个关键字:
app
:总是指您的应用程序的实例。
root
:指当前规则中的基本小部件/模板
self
:始终引用当前小部件
示例一:在按钮中绑定类里的方法
main.py
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
# 固定布局
class MyLayout(AnchorLayout):
Builder.load_file(r"kvfiles\mygui.kv")
def doSomething(self):
print("hello world.")
class MyGUIApp(App):
def build(self):
mylayout = MyLayout();
return mylayout
if __name__ == '__main__':
MyGUIApp().run()
mygui.kv
#:kivy 2.1.0
<MyLayout>:
anchor_x: "center"
anchor_y: "bottom"
Button:
text: "hello"
# 设置按钮的尺寸
size_hint: 0.2, 0.2
# 调用方法,也可以直接写 on_press: print("hello world")
on_press: root.doSomething()
结果示例二:在自定义模板里调用类里的方法循环添加另一个自定义模板,模板代替重复小部件、python里实例化自定义模板详细文档
my.py
from kivy.app import App
from kivy.lang import Builder
from kivy.factory import Factory
from kivy.uix.stacklayout import StackLayout
class MyStackLayout(StackLayout):
def addLabelWidget(self):
i = 0
while(i < 5):
# 用 Factory 实例化自定义模板,每次生成新的一个自定义模板都得 Factory.xxx(),即不可放在循环外面
mylabel = Factory.MyLabel()
mylabel.text = str(i)
i += 1
#print(self)
self.add_widget(mylabel)
class MyApp(App):
Builder.load_file("kvfiles\my.kv")
def build(self):
return MyStackLayout()
if __name__ == '__main__':
MyApp().run()
my.kv
#:kivy 2.1.0
<MyLabel@Label>:
size_hint: (0.2, 0.2)
font_size: 20
color: (0, 0, 0, 1)
canvas:
Color:
rgba: (1, 233/255, 224/255, 0.5)
Rectangle:
size: self.size
pos: self.pos
<MyButton@Button>:
background_normal: ''
background_color: (0, 0.2, 0.65, 0.5)
size_hint: (0.2, 0.2)
# 若是自定义控件模板里的按钮(控件)想调用方法,则需要加上 'app' 关键字:
on_release: app.root.addLabelWidget()
<MyStackLayout>:
#绘制白色背景
canvas:
Color:
rgba: (1, 1, 1, 1)
Rectangle:
size: self.size
pos: self.pos
MyButton:
text: "增加Lable!"
结果:(三)滚动视图ScrollView
滚动视图官方文档
示例:尝试在ScrollView里放入一个能在y轴上滚动的布局
main.py
from kivy.app import App
from kivy.lang import Builder
class MainApp(App):
def build(self):
return Builder.load_file("kvfiles\main.kv")
if __name__ == '__main__':
MainApp().run()
main.kv
滚动视图关键是:
① 如果要在x或y轴其中一条轴上滚动,那么需使子项(ScrollView下的布局或其它控件)中的size_hint_x
或size_hint_y
为None
(若都设为None
,则x与y轴都有可能滚动)
② 设置ScrollView的do_scroll_x
与do_scroll_y
的布尔值(若都设为True
,则x与y轴都能滚动)
③ (很重要)设置好子项的height
或width
#:kivy 2.1.0
BoxLayout:
# 绘制白色背景
canvas:
Color:
rgba: (1, 1, 1, 1)
Rectangle:
size: self.size
pos: self.pos
# 滚动视图
ScrollView:
# 在y轴上滚动
do_scroll_x: False
do_scroll_y: True
# 使用鼠标滚轮滚动时移动的距离
scroll_wheel_distance: 20
# 滚动类型:滑动条滚动、直接拖到内容滚动
scroll_type: ['bars', 'content']
# 滑动条宽度
bar_width: 20
# 滑动条拉动时的颜色
bar_color: [62/255, 154/255, 197/255, 0.8]
# 没滑动内容时的颜色
bar_inactive_color: [62/255, 154/255, 197/255, 0.5]
# 放入布局
StackLayout:
orientation: 'lr-tb'
#padding: 5
#spacing: 20
size_hint_y: None
# Button默认高度为 100,放置了9个Button,即总高度为900;也可在python里设置循环添加按钮,自动计算高度
height: 900
Button:
id: idbtn
text: str(idbtn.height)
size_hint: (1, None)
Button:
text:"按钮2"
size_hint: (1, None)
Button:
text:"按钮3"
size_hint: (1, None)
Button:
text:"按钮4"
size_hint: (1, None)
Button:
text:"按钮5"
size_hint: (1, None)
Button:
text:"按钮6"
size_hint: (1, None)
Button:
text:"按钮7"
size_hint: (1, None)
Button:
text:"按钮8"
size_hint: (1, None)
Button:
text:"按钮9"
size_hint: (1, None)
结果:(四)窗口固定尺寸与最小尺寸
# 窗口初始化时的尺寸
from kivy.config import Config
# width、height数值自行设置
Config.set('graphics', 'width', '1300')
Config.set('graphics', 'height', '750')
from kivy.core.window import Window
# 窗口的最小尺寸
Window.minimum_width = 1300
Window.minimum_height = 750
(五)中文乱码问题解决(以微软雅黑为例)
第一步:将中文字体文件复制到虚拟环境所在文件夹(或python所在文件夹)>Lib\site-packages\kivy\data\fonts
第二步:C盘里.kivy文件的config.ini里面,找到“default_font”一栏,更改为
default_font = ['Microsoft YaHei UI', 'data/fonts/msyh.ttc']