一,前言
之前看qpc源碼聯想到了GUI,現在又手癢了,想玩玩GUI了。正好之前看到一個不做的python GUI庫,想學習下,那麼就做個小項目練習下吧~
二,立項
關於智能手錶我們都不陌生,那麼它是如何設計切換多層頁面的呢,我之前看到過一個blog,寫的不錯。反正我是沒有想到要這麼去做,看了那篇blog我豁然開朗,這個方法還是比較方便的。c語言就是數據結構和算法,我看了它的數據結構設計基本就知道他要怎麼設計算法邏輯了。所以我本次拿這個python GUI庫玩玩智能手錶多層界面切換。
typedefstruct
{
uchar current;
uchar up;//向上翻索引號
uchar down;//向下翻索引號
uchar enter;//確認索引號
void (*current_operation)();
} key_table;
我設計的只有向下翻頁和確認。至於python做類似c語言的結構體和函數指針好像也有很多方法,但是我只熟悉一種class類然後用list追加的方法,先將就用這樣的設計思路來仿照c語言吧。因爲我的目的是玩玩這個dearpygui的庫。
三,效果
在列表中,通過Down按鈕被選中的就先加"_",暫時也沒變顏色和字體。按ok按鈕進入下級菜單或返回上級。
動態效果視頻
四,python源碼
import dearpygui.dearpygui as dpg
# button
func_index = 0
last_index = 255
class diapTable:
def __init__(self):
current = 0
down = 0
confirm = 1
def caller(self, func):
func()
def fun0():
dpg.set_value("text item", "Welcome")
dpg.set_value("text item2", "")
dpg.set_value("text item3", "")
def fun1():
dpg.set_value("text item", "Return_")
dpg.set_value("text item2", "[1]Weather")
dpg.set_value("text item3", "[2]Music")
def fun2():
dpg.set_value("text item", "Return")
dpg.set_value("text item2", "[1]Weather_")
dpg.set_value("text item3", "[2]Music")
def fun3():
dpg.set_value("text item", "Return")
dpg.set_value("text item2", "[1]Weather")
dpg.set_value("text item3", "[2]Music_")
def fun4():
dpg.set_value("text item", "Funny")
dpg.set_value("text item2", "")
dpg.set_value("text item3", "")
def fun5():
dpg.set_value("text item", "Big big world")
dpg.set_value("text item2", "")
dpg.set_value("text item3", "")
displist = []
displist.append(diapTable())
displist[0].current = 0
displist[0].down = 0
displist[0].confirm = 1
displist[0].caller = fun0
displist.append(diapTable())
displist[1].current = 1
displist[1].down = 2
displist[1].confirm = 0
displist[1].caller = fun1
displist.append(diapTable())
displist[2].current = 2
displist[2].down = 3
displist[2].confirm = 4
displist[2].caller = fun2
displist.append(diapTable())
displist[3].current = 3
displist[3].down = 1
displist[3].confirm = 5
displist[3].caller = fun3
displist.append(diapTable())
displist[4].current = 4
displist[4].down = 4
displist[4].confirm = 2
displist[4].caller = fun4
displist.append(diapTable())
displist[5].current = 5
displist[5].down = 5
displist[5].confirm = 3
displist[5].caller = fun5
# display
dpg.create_context()
def button_callback(sender, app_data, user_data):
global func_index,last_index
if user_data == "down":
func_index = displist[func_index].down
elif user_data == "ok":
func_index = displist[func_index].confirm
else:
pass
if func_index != last_index:
displist[func_index].caller()
last_index = func_index
with dpg.window(label="Control", pos=(0,0)):
# user data and callback set when button is created
dpg.add_button(label="Down", callback=button_callback, user_data="down")
# user data and callback set any time after button has been created
btn = dpg.add_button(label="Ok", )
dpg.set_item_callback(btn, button_callback)
dpg.set_item_user_data(btn, "ok")
with dpg.window(label="Display", pos=(100, 0), width=150):
dpg.add_text("welcome", tag="text item")
dpg.add_text("", tag="text item2")
dpg.add_text("", tag="text item3")
displist[func_index].caller()
dpg.create_viewport(title='Apple Watch demo', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
# below replaces, start_dearpygui()
while dpg.is_dearpygui_running():
dpg.render_dearpygui_frame()
dpg.destroy_context()
五,小結
這個庫看起來顯示效果不錯。只是我還不清楚如何修改字體顏色或添加button邊框,help中只是明顯的寫了綁定font,沒有明顯看到color等函數。分分鐘一個小的智能手錶界面就有了,祝福大家兔年快樂~