python kivy 開發經驗總結

2021-08-14 19:30:56 字數 3957 閱讀 8048

kivy 是一款 python 的gui開發框架,特點是樣式可以和**分離,繪圖功能基於opengl編寫,可以用來開發比較炫的介面,並且可以打包為android、ios等移動應用,還能執行在linux、windows、macos上。

我們塔爾旺科技****準備開發一款能對進行畫框標註的程式,因為是內部使用,所以選用 python kivy 作為gui框架。之前從網上已經得知 kivy 雖然有專業團隊支撐,但是框架不如 pyqt 或者 wxwindow 成熟,由於太容易上手,並且很喜歡kivy的樣式分離的模式,所以依然決定使用一次。

首選需要閱讀 kivy 入門教程,讀一遍introduction 和 programming guide,寫幾個小例子,基本就差不多了。

上面這些內容,都可以在 kivy 入門教程 中找到。

下面記錄的就是我們在開發中積累的一些經驗了。

這個布局,會看子 widget 的pos_hintsize_hint,依據他們來計算子 widget 的位置和大小,還可以用子 widget 的pos屬性來指定自己的位置 (用的是視窗座標系)。

pos_hintsize_hint這兩個屬性的取值都是 0 到 1,並且 size_hint 預設值是 1 , 所以可以用 floatlayout 實現完全填充父容器的效果。

因此,可以簡單的理解為:

1. floatlayout 的子 widget 可以定位到任意位置

2. floatlayout 的子 widget 大小可以充滿整個父容器,或為父容器的幾分之一。

這個布局需要注意,它只能設定一種位置關係,所有的子容器都使用該關係進行定位。

定位的引數要靠 anchorlayout 物件的 anchor_x 和 anchor_y 屬性來確定,而不是像其他的 layout 類,依靠子 widget 的 pos_hint 屬性來設定widget的位置。這給使用帶來了不便,也是容易誤解的一大問題。

小技巧:可以用 floatlayout + anchorlayout 來實現居中的效果。例如下面的kv language:

: # float layout

anchorlayout: # 小技巧,居中子widget

labelmanager: # relative layout

id: label_manager

size_hint: none, none

size: '800dp', '800dp'

# canvas:

# color:

# rgb: 0, 1, 0

# rectangle:

# pos: (0, 0) # relative 的容器,位置要使用0,0,對自己的canvas已經使用了區域性座標系

# size: self.size

imagewidget:

id: image

label_manager: label_manager

pos_hint:

size: self.parent.size

button:

pos_hint:

size_hint: none, none

size: '150dp', '50dp'

text: '開啟目錄'

font_size: '16sp'

color: .5, .7, .9, 1

on_press: root.show_load()

當然,我們還有乙個更簡單的居中方法:

: # float layout

labelmanager: # relative layout

id: label_manager

size_hint: none, none

size: '800dp', '800dp'

center: self.parent.center

relativelayout 可以讓子widget的定位座標原點變成widget的左下角,而不是頂層視窗的左下角;當relativelayout的位置移動時,子widget的位置會聯動,以保持父子位置不變。

觸控點的座標:如果乙個widget的父容器有relativelayout、scatterlayout、scatter 和scrollview 那麼當觸控(touch)事件傳遞到這些容器的子容器時,座標點會被轉換為容器座標系的數值,而不再是頂層視窗的座標了。要注意的是,對於這些特殊容器而言,觸控座標不會轉換,只有他們的子widget會收到轉換後的座標。

文件中用三種座標系統來描述這些關係,分別是:

window coordinates 視窗座標系

是最頂層視窗的座標系,以視窗的左下角為原點。

parent coordinates 父座標系

距離本widget最近的乙個特殊父容器的區域性座標系。

local / widget coordinates 區域性或widget座標系

以本widget的左下角為原點的座標系。

widget 類提供了4個方法來對這三種座標系進行轉換,分別是:

to_widget()接收視窗座標,返回區域性座標。

to_window()接收區域性座標 ,返回視窗座標。

to_parent()接收區域性座標,返回父座標。

to_local()接收父座標,返回區域性座標。

kivy 的clock類提供了幾種時鐘排程機制,分別是clock.scheduled_once(),clock.schedule_interval()clock.create_trigger()

使用的例子:

def my_callback(dt):

pass

// call my_callback every 0.5 seconds

event = clock.schedule_interval(my_callback, 0.5)

// call my_callback in 5 seconds

event2 = clock.schedule_once(my_callback, 5)

event_trig = clock.create_trigger(my_callback, 5)

event_trig()

// unschedule using cancel

event.cancel()

// unschedule using clock.unschedule

clock.unschedule(event2)

原來是因為把自定義的widget放到了floatlayout下,floatlayout會根據size_hit管理子 widget 的大小,所以自己修改的 size 不起作用。解決的方法是設定子widget的size_hit 為(none, none),需要在建立物件時作為建構函式的引數傳入,例如:

bbox(size_hint=(none, none))
但是不能是設定pos_hint=(none, none)否則報錯,想想也對,因為 floatlayout 的主要作用就是能根據子widget的 pos_hint 來定位,如果不用這個屬性,那乾脆就不用 floatlayout 好了。

def on_start(self):

self.root_window.maximize()

CSS framework日常開發的經驗總結

二 css框架的開發順序 1 格式化 reset.css 格式化css的真正好處是能夠快速啟動工作,你可以在新的html檔案裡引入框架,不用再處理重置padding 和 margins,實現統一的排版 瀏覽器下的相同表現。2 布局 layout.css 定義頁面是二欄還是三欄,是全屏還是1024 7...

SOPC Builder Nios學習經驗總結

上的不一致。3.在nois ii中bulid例程hello world都出現了錯誤,錯誤提示為 gdrive c altera kits nios2 components altera nios2 hal src alt busy sleep.c 68 error parse error befor...

mysql開發經驗 MySql開發經驗

1 wait timeout 預設288800秒 8小時 jdbc連線池maxwait或者maxldeltime這兩個引數要小於這個值,否則,當你的連線長時間沒和資料庫互動,伺服器早就把你的連線斷開了,而你的連線池還認為是有效連線,除非你設定testonborrow或者設定testonreturn設...