本文介绍如何用DearPyGui创建窗体,并点击该窗体上的按钮,打开另外一个窗体。
创建main.py,并绘制第一个窗体
import dearpygui.dearpygui as dpg
dpg.create_context()
# 注册字体,自选字体
with dpg.font_registry():
with dpg.font("song.ttf", 20) as font1: # 增加中文编码范围,防止问号
dpg.add_font_range_hint(dpg.mvFontRangeHint_Default)
dpg.add_font_range_hint(dpg.mvFontRangeHint_Chinese_Simplified_Common)
dpg.add_font_range_hint(dpg.mvFontRangeHint_Chinese_Full)
dpg.bind_font(font1)
# 创建view
dpg.create_viewport(title='DearPyGui Test', width=800, height=400)
# 创建window
with dpg.window(label='window1', width=300, height=300, pos=(20, 20), tag='win1'):
dpg.add_button(label='open win2', tag='button')
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
解释:通过上面代码,我们创建了一个window如下:

image.png
我们需求:点击“open win2”按钮,会出现一个新的window。
操作如下:

image.png
在当前根目录下,创建一个app文件夹,进入该文件夹,创建win2.py文件,代码如下:
import dearpygui.dearpygui as dpg
def show():
# 创建window
with dpg.window(label='打招呼', width=300, height=300, pos=(340, 20), tag='win2'):
dpg.add_text(default_value='hello world!')
这样,我们只要在mian.py的button的回调函数中,调用这个show()就可以出现一个新的窗口了。为此,我们将mian.py修改如下:
import dearpygui.dearpygui as dpg
from app import win2
dpg.create_context()
# 注册字体,自选字体
with dpg.font_registry():
with dpg.font("song.ttf", 20) as font1: # 增加中文编码范围,防止问号
dpg.add_font_range_hint(dpg.mvFontRangeHint_Default)
dpg.add_font_range_hint(dpg.mvFontRangeHint_Chinese_Simplified_Common)
dpg.add_font_range_hint(dpg.mvFontRangeHint_Chinese_Full)
dpg.bind_font(font1)
# 创建view
dpg.create_viewport(title='DearPyGui Test', width=800, height=400)
# 创建window
with dpg.window(label='window1', width=300, height=300, pos=(20, 20), tag='win1'):
# button的回调函数
def click():
win2.show()
dpg.add_button(label='open win2', tag='button', callback=click)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
运行后,点击button,如下图:

image.png
问题还没完。大家可以尝试再点击一下button,是不是发现会报错?

image.png
原因很简单:在win2窗体创建的时候,我们用 tag='win2'来确认了窗体的唯一性。对DearPyGui来说,tag不允许重复出现,因此我们在第二次点击button时,代码试图再创建一个tag='win2'的窗体,DearPyGui就立刻报错了。
解决办法很简单:修改win2.py如下:
import dearpygui.dearpygui as dpg
def show():
# 如果检测存在tag是win2的窗体,则删除窗体(以便后面代码重新再生成一个新的tag='win2'的窗体
if dpg.does_item_exist(item='win2'):
dpg.delete_item(item='win2')
# 创建window
with dpg.window(label='打招呼', width=300, height=300, pos=(340, 20), tag='win2'):
dpg.add_text(default_value='hello world!')
即:我们在创建一个窗体前,先根据tag查询一下这个窗体是否存在。如不存在,直接创建。如存在,则删除创后后重新创建。
至此,需求完成,问题也解决。顺便说一下,以后除了main.py创建的窗体,其余的所有的窗体都可以放入app目录下。这个将来我们创建menu,或者更新程序的时候,会更方便。以后有时间再具体说,先养成习惯。
下一篇我们将说一下:1、同窗体不同组件间数据传递;2、不同窗体间数据传递;(其实会python应该现在已经知道如何做了)