当前位置:   article > 正文

NICEGUI库,一个有点新、有点酷的PYTHON UI库(五)给按钮添加事件函数_nicegui怎样保存设置参数

nicegui怎样保存设置参数

经过前面的装饰,软件已经有了骨架了,但是没有各类函数,只是能看、好看是没用的,还需要添加灵魂。那么接下来就是添加各类函数。

首先介绍下我这个项目,它后期需要打开时加载一些之前保存的设置内容,在之后软件有一项功能是操作EXCEL排版进行打印的,但是在打印的纸张是自定义纸张,也就是在EXCEL排版时,xlsxwriter库设置纸张时需要一个叫纸张ID的东西,一般情况下A4是9,但是自定义纸张就完全不确定了。

一、保存、加载软件设置

首先需要一个本地化的小型的数据库,这里使用的是PYTHON的tinydb库,它的本质就是一个JSON文件,不断的操作JSON来实现数据库的效果。我将tinydb封装到一个类中,方便软件后期的读写。具体tinydb怎么搞大家可以在网上找资料,很简单。直接上代码(我将它保存为名“utils_tinydb.py”:

  1. from tinydb import TinyDB, Query, where
  2. class Tiny_setting:
  3. tinydb = TinyDB('setting.json') #加载JSON文件
  4. def insert_data(self, tb_name, kv_dic): #将KV_DIC字典插入到表名TB_NAME中
  5. table = self.tinydb.table(tb_name)
  6. table.insert(kv_dic)
  7. def del_data(self, tb_name, condition): #将TB_NAME中符合CONDITION条件的删除,使用方法如注释
  8. table = self.tinydb.table(tb_name)
  9. table.remove(condition)
  10. # condition = Query()
  11. # del_data('table_b', condition.age == 16)
  12. def update_data(self, tb_name, new_dic, key=None, value=None): #将TB_NAME中符合KEY=VALUE的值更新为NEW_DIC
  13. print(tb_name, new_dic, key, value)
  14. table = self.tinydb.table(tb_name)
  15. if key:
  16. table.update(new_dic, where(key) == value)
  17. else:
  18. table.update(new_dic)
  19. def search_data(self, tb_name, condition): #查找TB_NAME中符合CONDITION的结果,使用方法如注释
  20. table = self.tinydb.table(tb_name)
  21. data = table.search(condition)
  22. return data
  23. # qry = Query()
  24. # data = search_data('table_b', qry.name=='andy')
  25. def all_data(self, tb_name): #查找TB_NAME中所有的结果
  26. table = self.tinydb.table(tb_name)
  27. data = table.all()
  28. return data

在'setting.json'中的内容是:

{"sys_setting": {"1": {"printer_id": 9}}}

代码实现如下:

  1. tinydb_class = utils_tinydb.Tiny_setting()
  2. boot_settings = tinydb_class.all_data(tb_name='sys_setting')
  3. ui.input(label='打印机使用的纸张ID', value=boot_settings['printer_id'])

二、获取打印机纸张ID并更新设置

这段代码网上没找到,也许有更灵活的办法,但是我也没翻到。最终问了GPT,给出了如下的答案:

  1. def get_paper_size():
  2. # 获取默认打印机名称
  3. default_printer = win32print.GetDefaultPrinter()
  4. try:
  5. # 打开打印机句柄
  6. printer_handle = win32print.OpenPrinter(default_printer)
  7. # 获取打印机信息
  8. printer_info = win32print.GetPrinter(printer_handle, 2)
  9. # 获取默认纸张ID
  10. default_paper_id = printer_info['pDevMode'].PaperSize
  11. return default_paper_id
  12. except:
  13. # 关闭打印机句柄
  14. return 0

再编写两个用于设置INPUT结果的函数:

  1. def update_paper_size(cls, printer_id_current): #更新软件基本设置中的打印机ID
  2. cls.update_data('sys_setting', {"printer_id": printer_id_current.value})
  3. return
  4. def set_input_text(input_box, value): #设置INPUTBOX中的值
  5. input_box.value = value
  6. return

以上三个函数保存在文件名为local_utils.py中,然后主程序main的代码如下:

  1. from nicegui import ui
  2. import local_utils
  3. import utils_tinydb
  4. def title(title):
  5. ui.label(title).classes('self-center text-5xl/[80%] font-bold m-5').style("font-family:HeiTi")
  6. def header(text):
  7. with ui.header(elevated=True).classes('w-full bg-primary text-white mt-2'):
  8. ui.label(text).classes('fixed-top-right mt-2')
  9. def footer(text):
  10. with ui.footer().classes('w-full bg-primary text-white mb-2'):
  11. ui.label(text).classes('fixed-bottom-right mb-2')
  12. def ui_main(tinydb_class):
  13. boot_settings = tinydb_class.all_data(tb_name='sys_setting')[0]
  14. header('页眉')
  15. title('信息管理系统设置')
  16. with ui.grid(columns=2).classes('w-[80%] self-center row'):
  17. with ui.tabs().classes('col-2 self-center').props('vertical') as tabs:
  18. func0 = ui.tab("func0", label='首页', icon='home').style('color:red')
  19. func1 = ui.tab('func1', label='功能一', icon='money').style('color:orange')
  20. func2 = ui.tab('func2', label='功能二', icon='devices_other').style('color:black')
  21. func3 = ui.tab('func3', label='功能三', icon='api').style('color:green')
  22. func4 = ui.tab('func4', label='功能四', icon='apps').style('color:blue')
  23. with ui.tab_panels(tabs, value=func0).classes('col self-center'):
  24. with ui.tab_panel(func0):
  25. ui.label('基础设置').classes('text-3xl/[80%] font-bold m-2').style("font-family:KaiTi")
  26. with ui.column():
  27. with ui.row():
  28. printer_id_current = ui.input(label='打印机使用的纸张ID', value=boot_settings['printer_id']).classes('text-xl/[80%] m-2').style("font-family:FangSong")
  29. ui.button("保存并设置默认纸张ID", on_click=lambda: local_utils.update_paper_size(tinydb_class, printer_id_current))
  30. with ui.row():
  31. printer_id_default = ui.input(label='当前默认纸张ID', value='').props('disable').classes('text-xl/[80%] m-2').style("font-family:FangSong")
  32. ui.button("获取默认纸张ID", on_click=lambda: local_utils.set_input_text(printer_id_default, local_utils.get_paper_size()))
  33. with ui.tab_panel(func1):
  34. ui.label('功能一').classes('text-3xl/[80%] font-bold m-2').style("font-family:KaiTi")
  35. with ui.tab_panel(func2):
  36. ui.label('功能二').classes('text-3xl/[80%] font-bold m-2').style("font-family:KaiTi")
  37. with ui.tab_panel(func3):
  38. ui.label('功能三').classes('text-3xl/[80%] font-bold m-2').style("font-family:KaiTi")
  39. with ui.tab_panel(func4):
  40. ui.label('功能四').classes('text-3xl/[80%] font-bold m-2').style("font-family:KaiTi")
  41. footer('页脚')
  42. if __name__ == '__main__':
  43. tinydb_class = utils_tinydb.Tiny_setting()
  44. ui_main(tinydb_class)
  45. ui.run(reload=False, native=True)

这样,一个加载启动项,同时可以设置更新启动项的初级程序就做好了,效果如下:

启动项加载成功,JSON文件中的PRINTER_ID是9

获取打印机的默认纸张成功,当前是A4纸,下方的INPUT也是9 

 在打印首选项中调整纸张为B5,点击获取默认纸张,变成是13

将当前的纸张ID填入第一个INPUT中,然后点存保存,JSON文件中的PRINTER_ID保存为13 

 至此,一个基本的能够实现基本功能的NICEGUI界面搭建完成。后期踩入了哪些坑我再分享给大家。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号