一、安裝 Kivy
pip install kivy
或者
python -m pip install kivy
若安裝失敗,也要更新pip(下方)再重新安裝
二、創(chuàng)建虛擬環(huán)境(可選)
virtualenv 虛擬環(huán)境安裝方法、virtualenv 官方文檔
1.更新 pip
"(python位置)···\···\python.exe" -m pip install --upgrade pip
2.安裝 virtualenv
在命令窗口里進入虛擬環(huán)境的保存路徑(自己創(chuàng)建文件夾),如pythonVirtualenv為保存虛擬環(huán)境的文件夾,則
D:\pythonVirtualenv
進入路徑后輸入
virtualenv -p "(python位置)···\···\python.exe" testEnvrms
其中 testEnvrms為虛擬環(huán)境的名稱(自己定義)
3.激活 virtualenv
環(huán)境路徑 + 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文件
命名規(guī)則:繼承了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文件里加上 <自定義的類名>:
"一個類規(guī)則,由< >之間的小部件類的名稱聲明,后跟:,定義該類的任何實例的外觀和行為"
<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:指當前規(guī)則中的基本小部件/模板
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()
結果
示例二:在自定義模板里調用類里的方法循環(huán)添加另一個自定義模板,模板代替重復小部件、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(),即不可放在循環(huán)外面
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里設置循環(huán)添加按鈕,自動計算高度
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
(五)中文亂碼問題解決(以微軟雅黑為例)
第一步:將中文字體文件復制到虛擬環(huán)境所在文件夾(或python所在文件夾)>Lib\site-packages\kivy\data\fonts
第二步:C盤里.kivy文件的config.ini里面,找到“default_font”一欄,更改為
default_font = ['Microsoft YaHei UI', 'data/fonts/msyh.ttc']