1、DearPyGui,通过组件打开另外一个窗体

本文介绍如何用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应该现在已经知道如何做了)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容