kivy:安裝并使用Kivy、應用python + kv語言

一、安裝 Kivy

安裝 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()

結果
使用 kivy 顯示hello world

四、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

結果
繼承自App的類使用myapp.kv
情況②:若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

結果
使用Builder導入kv文件
情況③:若需要在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文件效果
(二)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!"

結果:
按鈕on_release.gif
(三)滾動視圖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_xsize_hint_yNone(若都設為None,則x與y軸都有可能滾動)
② 設置ScrollView的 do_scroll_xdo_scroll_y的布爾值(若都設為True,則x與y軸都能滾動)
③ (很重要)設置好子項的 heightwidth

#: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)

結果:
ScrollView.gif
(四)窗口固定尺寸與最小尺寸
# 窗口初始化時的尺寸
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']

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容