DearPyGui 教程(四)
(注:由于DearPyGui正处于快速迭代期,功能日兴月易,本文所描述的内容很有可能已经过时,如需了解最新信息,请至源文链接:https://hoffstadt.github.io/DearPyGui/tutorial.html)
本教程旨在演示如何使用DearPyGui的一部分特性,并未覆盖DearPyGui的全部功能,更多复杂功能的示例可以在GitHub上的示例文件夹中看到. 有关特定API的信息建议参考 API Reference.
Delta Time 和 内部时钟
DearPyGui有一个内置的时钟来检查总运行时间, 使用 get_total_time() 可以获取以秒为单位的总运行时间。
还可以使用命令 get_delta_time() 获取渲染帧之间的时间(以秒为单位)。
from dearpygui.core import *
def on_render(sender, data):
delta_time = str(round(get_delta_time(), 4))
total_time = str(round(get_total_time(), 4))
set_value("delta_time", delta_time)
set_value("total_time", total_time)
add_text("Total Time: ")
add_same_line()
add_label_text("##total_time_text", source="total_time")
add_text("Delta Time: ")
add_same_line()
add_label_text("##delta_time_text", source="delta_time")
set_render_callback(callback=on_render)
start_dearpygui()
Sprite(精灵)
我们可以用带有标签、get_delta_time() 和回调的drawing绘图创建一个精灵符号(sprite character)。 下面的示例,我们需要从GitHub上的示例文件夹下载图片 SpriteMapExample.png,并将其放置在你的python文件所在的同级目录中。(有关sprite 和 image的区别可以参考[这里])
绘图是通过调用 add_drawing() 来启动的,然后就可以通过相应的绘图命令来添加各个项。 画布的原点在左下角。
from dearpygui.core import *
def on_render(sender, data):
delta_draw_time = get_data("delta_draw_time")
draw_speed = get_value("Draw Pause")
if delta_draw_time > draw_speed:
if get_value("Fly Mode") == 0:
if get_data("sprite1"):
draw_image("Drawing_1", 'SpriteMapExample.png', top_left, pmax=bottom_right, uv_min=[.7690, 0],
uv_max=[.8074, .10], tag="sprite")
add_data("sprite1", False)
else:
draw_image("Drawing_1", 'SpriteMapExample.png', top_left, pmax=bottom_right, uv_min=[.8074, 0],
uv_max=[.8461, .10], tag="sprite")
add_data("sprite1", True)
else:
if get_data("sprite1"):
draw_image("Drawing_1", 'SpriteMapExample.png', top_left, pmax=bottom_right, uv_min=[.8464, 0],
uv_max=[.8848, .10], tag="sprite")
add_data("sprite1", False)
else:
draw_image("Drawing_1", 'SpriteMapExample.png', top_left, pmax=bottom_right, uv_min=[.8851, 0],
uv_max=[.9235, .10], tag="sprite")
add_data("sprite1", True)
add_data("delta_draw_time", 0)
else:
add_data("delta_draw_time", delta_draw_time + get_delta_time())
set_main_window_size(650, 800)
add_drawing("Drawing_1", width=500, height=500)
top_left = [250, 250]
bottom_right = [300, 300]
draw_image("Drawing_1", 'SpriteMapExample.png', top_left, pmax=bottom_right, uv_min=[.7687, 0], uv_max=[1, .10], tag="sprite")
add_text("Fly Mode:")
add_radio_button("Fly Mode", items=["Disable", "Enable"], default_value=0)
add_slider_float("Draw Pause", default_value=0.1, min_value=0.0, max_value=0.5, tip="slows down draws by waiting until the elapsed time", format="%.4f")
set_render_callback(on_render)
add_data("delta_draw_time", 0.0)
add_data("sprite1", True)
start_dearpygui()
Table(表)
DearPyGui有一个低级别的table API,非常适合静态和动态表。
table 小部件通过 add_table() 来调用。
要编辑table 小部件,我们可以使用 add_row() add_column() 将行/列附加到表的最后。
也可以用 insert_row() insert_column() 插入行/列。 列和行插入的位置根据 index 索引参数决定。 如果指定索引位置已经存在行/列,则已有的行/列将被挤到后面,并在指定的索引位置处插入新的行/列。此外,添加或插入的行/列默认情况下将用空单元格填充未指定的单元格。
from dearpygui.core import *
add_table("Table Example", ["Header 0", "Header 1"])
add_row("Table Example", ["row 0", "text"])
add_row("Table Example", ["row 2", "text"])
add_column("Table Example", "Header 3", ["data","data"])
insert_row("Table Example", 1, ["row 1", "inserted row", "inserted row"])
insert_column("Table Example", 2, "Header 2", ["inserted with column", "inserted column", "inserted column"])
start_dearpygui()
效果:
此外,可以重命名标题和单元格,并更改它们的值
from dearpygui.core import *
def modify_tables(sender, data):
log_debug(f"Table Called: {sender}")
coord_list = get_table_selections("Table Example")
log_debug(f"Selected Cells (coordinates): {coord_list}")
for coordinates in coord_list:
set_table_item("Table Example", coordinates[0], coordinates[1], "New Value")
set_headers("Table Example", ["New Header 0", "New Header 1", "New Header 2"])
show_logger()
add_spacing(count=5)
add_button("Modify Selected Table Values", callback=modify_tables)
add_spacing(count=5)
add_table("Table Example", ["Header 0", "Header 1"])
add_row("Table Example", ["awesome row", "text"])
add_row("Table Example", ["super unique", "unique text"])
add_column("Table Example", "Header 2", ["text from column", "text from column"])
add_row("Table Example", ["boring row"])
start_dearpygui()
表的单元格是可以被选中的, 这意味着我们可以通过回调获取到哪个单元格被选中,甚至获取单元格中的文本。
from dearpygui.core import *
def table_printer(sender, data):
log_debug(f"Table Called: {sender}")
coord_list = get_table_selections("Table Example")
log_debug(f"Selected Cells (coordinates): {coord_list}")
names = []
for coordinates in coord_list:
names.append(get_table_item("Table Example", coordinates[0], coordinates[1]))
log_debug(names)
show_logger()
add_table("Table Example", ["Header 0", "Header 1"], callback=table_printer)
add_row("Table Example", ["awesome row", "text"])
add_row("Table Example", ["super unique", "unique text"])
add_column("Table Example", "Header 3", ["text from column", "text from column"])
add_row("Table Example", ["boring row"])
start_dearpygui()