一,前言
之前看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按钮进入下级菜单或返回上级。
image.png
动态效果视频
GIF 2023-1-22 15-40-19.gif
四,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等函数。分分钟一个小的智能手表界面就有了,祝福大家兔年快乐~
网友评论