Python DearPyGui 进阶

python 同时被 2 个专栏收录
11 篇文章 0 订阅
12 篇文章 0 订阅

控件和窗口回调

每个输入控件都有一个回调,该回调在控件交互时运行,回调用于为控件提供功能实现。回调可以在创建时或在创建后使用 set_item_callback 分配给窗口控件。

DearPyGui 中,应用于控件的每个回调方法都必须包含一个 senderdata 参数。DearPyGui 使用 sender 参数来通知回调——哪个控件通过发送 name 来触发回调。控件再通过指定 callback_data 参数来发送数据到回调方法的 data 参数。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def button_callback(sender, data):
    log_debug(f"Sender is: {sender}")
    log_debug(f"Data is: {data}")

show_logger()  # 使用logger窗口显示结果

with window("Tutorial"):
    add_input_text("输入文本", default_value="Hello DearPyGui!")
    add_button("提交", callback=button_callback, callback_data=get_value("输入文本"))
    add_button("提交##2", tip="创建控件后设置了回调")
    set_item_callback("提交##2", callback=button_callback, callback_data=get_value("输入文本"))

start_dearpygui()

在这里插入图片描述

每次与控件交互时,都可以使用回调来更新变量的值。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def update_var(sender, data):
    my_var = get_value("输入复选框")
    log_debug(my_var)

show_logger()  # 使用logger窗口显示结果

with window("Tutorial"):
    add_checkbox("输入复选框", callback=update_var)

start_dearpygui()

在这里插入图片描述

但是,上面的方法缺乏灵活性,无法实现通用的回调方法,下面是通过使用 sender 参数实现的一种更聪明的方法。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def update_var(sender, data):
    my_var = get_value(sender)
    log_debug(my_var)

show_logger()  # 使用logger窗口显示结果

with window("Tutorial"):
    add_checkbox("输入复选框", callback=update_var)
    add_input_text("输入文本", callback=update_var)
    add_input_int("输入整数", callback=update_var)

start_dearpygui()

在这里插入图片描述

窗口以及窗口类型的控件具有特殊的回调,这些回调在特殊的事件(例如窗口大小调整、窗口关闭等)上触发。on_close 将在窗口关闭时运行分配给该参数的回调,而 set_resize_callback 将在窗口被调整大小时运行,并且可以使用 handler 参数设置成任意窗口,默认值为 主窗口

另外,如果你希望每帧都执行一次回调,则可以使用 set_render_callback 方法。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def close_me(sender, data):
    log_debug(f"{sender} 窗口已经关闭")

def render_me(sender, data):
    log_debug(f"窗口 {sender} 运行了 set_render 回调")

def resize_me(sender, data):
    log_debug(f"窗口 {sender} 运行了 set_resize 回调")

show_logger()  # 使用logger窗口显示结果

with window("Tester", on_close=close_me):
    add_text('调整此窗口的大小将触发 set_resize 回调')
    add_text('关闭此窗口将触发 close 回调')

# logger窗口狂刷:[x.xx] [DEBUG]  窗口 Main Application 运行了 set_render 回调
# set_render_callback(render_me)

set_resize_callback(resize_me, handler="Tester")

start_dearpygui()

在这里插入图片描述

运行时添加和删除控件

Dear PyGui 支持在运行时动态添加和删除任何控件或窗口,通过使用回调运行所需控件的 add_*** 方法并指定该控件所属的 parent 来完成,默认情况下,如果未指定 parent,则将控件添加到主窗口。

而通过在添加控件时使用 before 参数,可以设置将新控件放在哪个控件之前,默认情况下,会将新控件放在最后。

from dearpygui.core import *
from dearpygui.simple import *

def add_buttons(sender, data):
    add_button("New Button 2", parent="Secondary Window")
    add_button("New Button", before="New Button 2")

def delete_buttons(sender, data):
    delete_item("New Button")
    delete_item("New Button 2")

show_debug()

with window("Tutorial"):
    add_button("Add Buttons", callback=add_buttons)
    add_button("Delete Buttons", callback=delete_buttons)

with window("Secondary Window"):
    pass

start_dearpygui()

在这里插入图片描述

删除窗口时,默认情况下,会删除窗口及其子控件,如果只想删除子控件,可以将 children_only 参数设置为 True 值。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def add_widgets(sender, data):
    with window("Secondary Window"):
        add_button("New Button 2")
        add_button("New Button")
        add_button("New Button 3", parent="Secondary Window")

def delete_widgets(sender, data):
    delete_item("Secondary Window")

def delete_children(sender, data):
    delete_item("Secondary Window", children_only=True)

show_debug()

with window("Tutorial"):
    add_button("添加窗口以及控件", callback=add_widgets)
    add_button("删除窗口以及子控件", callback=delete_widgets)
    add_button("删除窗口的子控件", callback=delete_children)

start_dearpygui()

在这里插入图片描述

值与数据存储

添加新的窗口控件时,会将 value 添加到 Value存储系统 中,默认情况下,此 value 的标识符是控件的 name。我们可以使用 source 参数覆盖标识符,这样做有一个好处,就是让多个控件控制同一个 value

  • 使用 get_valueValue存储系统 中检索 value
  • 使用 set_value 可以手动更改 value

为了使不同 value 类型的控件在 Value存储系统 中使用相同的值,必须先创建较大的 value。例如,当创建一个 input_float3 控件时,存储的 value 类型为 [float, float, float],后来创建的 input_float2 可以使用与 input_float3 相同的 source 值。

但是,如果先创建了 input_float2,然后尝试与 input_float3 共享其 source 值,则不起作用。为了使 input_float3input_float2 共享相同的 source 值,我们首先需要创建 input_float3,这可以通过add_value() 方法完成。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def print_me(sender, data):
    log_debug(f"复选框—value: {get_value('value_1')}")
    log_debug(f"文本—value: {get_value('value 2')}")
    log_debug(f"颜色—value: {get_value('color4')}")

def reset(sender, data):
    set_value("value_1", False)
    set_value("value 2", "Hello DearPyGui!")

show_logger()

with window("Tutorial"):
    add_checkbox("单选框 1", source="value_1")
    add_checkbox("单选框 2", source="value_1")
    add_input_text("文本输入 1", source="value 2")
    add_input_text("文本输入 2", source="value 2", password=True, tip="此文本框已隐藏密码")
    add_button("打印 source value", callback=print_me)
    add_button("重置 source value", callback=reset)
    # 将较小的输入类型的控件链接到较大的控件时的特殊情况,首先创建较大的值
    add_value("color4", (0.0, 0.0, 0.0, 0.0))
    add_color_edit3("颜色选择 3", source="color4")
    add_color_edit4("颜色选择 4", source="color4")

start_dearpygui()

在这里插入图片描述

Dear PyGui 还支持传入任意 Python 数据对象类型(甚至可以自定义数据类型)用于数据存储。使用 add_data,我们可以传入任意数据类型,并通过 get_data("name") 进行访问。

from dearpygui.core import *
from dearpygui.simple import *

add_additional_font('三极中柔宋.ttf', 18, glyph_ranges='chinese_simplified_common')

def store_data(sender, data):
    custom_data = {
        "Radio Button": get_value("Radio Button"),
        "Checkbox": get_value("Checkbox"),
        "Text Input": get_value("Text Input"),
    }
    add_data("stored_data", custom_data)

def print_data(sender, data):
    log_debug(get_data("stored_data"))

show_logger()

with window("Tutorial"):
    add_radio_button("Radio Button", items=["选项1", "选项2"])
    add_checkbox("Checkbox", label="复选框")
    add_input_text("Text Input", label="文本输入")
    add_button("存储数据", callback=store_data)
    add_button("打印数据", callback=print_data)

start_dearpygui()

在这里插入图片描述

  • 0
    点赞
  • 1
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
<p> <span style="font-size:16px;">本课程讲解Python语言高级用法的相关知识,兼顾Python编程的</span><span style="font-size:16px;color:#C00000;"><strong>术</strong></span><span style="font-size:16px;">(语言的知识点)与</span><span style="font-size:16px;color:#C00000;"><strong>道</strong></span><span style="font-size:16px;">(编程思维和程序设计方法)。</span> </p> <p> <br /></p> <p> <strong><span style="font-size:16px;">课程特点:</span></strong> </p> <p> <br /></p> <p> <span style="font-size:16px;">本课程采用Python3.7版本讲解,具体内容包括:30个Python进阶知识点、17个常用模块、文件与数据处理、并发编程、测试与优化、编程规范、Python之禅、软件设计策略与项目案例等。</span> </p> <p> <br /></p> <p> <span style="font-size:16px;">采用Jupyter Notebook讲解,图文并茂,讲述与代码对应。其文件分享给学员,可作为交互式电子书。本课程案例丰富,每个知识点均有代码示例说明,另有编程项目案例。</span> </p> <p> <br /></p> <p> <span style="font-size:16px;">学习本课程前,建议先学习前导课程《</span><span style="color:#C00000;font-size:16px;"><strong>Python编程的术与道:Python语言入门</strong></span><span style="font-size:16px;">》。</span> </p> <p> <span style="font-size:16px;"> </span></p><p> <span>课程链接:</span><span></span><span style="color:#E53333;">https://edu.csdn.net/course/detail/27845</span> </p> <p> 或选择套餐<span style="font-size:14px;">:</span><span style="font-size:14px;">《</span><span style="color:#E53333;"><strong>Python编程的术与道:Python语言入门与进阶(套餐)</strong></span><span style="font-size:14px;">》</span> </p> <br /> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004170053094839.jpg" alt="" /><br /></span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004170053264958.jpg" alt="" /><br /></span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004170053404092.jpg" alt="" /><br /></span> </p>
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页

打赏

何小有

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值