pysimplegui之画布,图形,表格和树结构元素

2023-06-14,,

画布元素

在我看来,tkinter Canvas 小部件是 tkinter 小部件中功能最强大的。虽然我尽我所能将用户与任何与 tkinter 相关的东西完全隔离,但 Canvas 元素是一个例外。它可以与许多其他软件包集成,通常会产生惊人的效果。

但是,还有另一种获得这种力量的方法,那就是通过 Graph Element,一个更强大的元素,因为它使用 Canvas,您可以在需要时直接访问它。Graph Element拥有大量Canvas Element所没有的绘制方法。另外,如果需要,您可以通过成员变量访问 Graph Element 的“Canvas”。

Matplotlib、Pyplot 集成

注意 - 最新版本的 Matplotlib (3.1.0) 不再适用于这种技术。您必须安装 3.0.3 才能使用演示程序部分中提供的演示 Matplotlib 程序。

一种这样的集成是与 Matplotlib 和 Pyplot。编写了一个 Demo 程序,您可以将其用作设计模式,以了解如何使用 Canvas Widget。

def Canvas(canvas - a tkinter canvasf if you created one. Normally not set
background_color - canvas color
size - size in pixels
pad - element padding for packing
key - key used to lookup element
tooltip - tooltip text)

获取 tkinter Canvas Widget 的操作顺序为:


figure_x, figure_y, figure_w, figure_h = fig.bbox.bounds
# define the window layout
layout = [[sg.Text('Plot test')],
[sg.Canvas(size=(figure_w, figure_h), key='canvas')],
[sg.OK(pad=((figure_w / 2, 0), 3), size=(4, 2))]] # create the window and show it without the plot
window = sg.Window('Demo Application - Embedding Matplotlib In PySimpleGUI', layout).Finalize() # add the plot to the window
fig_photo = draw_figure(window['canvas'].TKCanvas, fig) # show it all again and get buttons
event, values = window.read()

要从 PySimpleGUI 获取 tkinter Canvas 小部件,请执行以下步骤: * 将 Canvas 元素添加到您的窗口 * 布局您的窗口 * 调用window.Finalize()- 这是您不能忘记的关键步骤 * 通过使用键查找来查找 Canvas 元素 * 您的 Canvas 小部件对象将是 found_element.TKCanvas * 在画布上随心所欲地绘制 * 调用window.read()- 在调用 Read 之前,画布上不会出现任何内容

请参阅Demo_Matplotlib.py您可以复制的食谱。

方法和属性

TKCanvas - 不是方法而是属性。返回 tkinter 画布小部件

图形元素

所有数学爱好者都会喜欢这个元素......所有非数学爱好者都会更喜欢它。

我发现没有什么比从 GUI 框架处理图形坐标系更有趣的了。它总是与我想要的相反。(0,0) 在左上角……有时……还是在左下角?简而言之,这是一件让人头疼的事情。

如何获得自己的 (0,0) 位置,然后使用这些坐标而不是 tkinter 提供的坐标?这产生了非常强大的功能 - 以您自己的单位工作,然后在以像素定义的区域中显示它们。

如果您曾经对 (0,0) 在您绘制的某个表面上的位置感到沮丧,那么不要害怕,您的沮丧就到此为止了。您可以使用所需的任何坐标系进行绘制。将 (0,0) 放置在您想要的任何位置,包括图表上的任何位置。您可以定义一个 Graph,其 X 轴为 -2.1 到 -3.5 之间的所有负数,Y 轴为 -3 到 -8.2 之间的所有负数

您需要提供 3 个值来提供图形元素。他们是:

画布大小(以像素为单位)
坐标系的左下角 (x,y) 坐标
坐标系的右上角 (x,y) 坐标

提供这些值后,您可以通过创建图形图形在图形上乱涂乱画。Graph Figures被创建,并通过调用获得一个Figure ID:

画圆
画线
绘图点
绘制矩形
画椭圆
绘制图像

您可以通过提供要移动的x,y 增量的图形 ID 在画布上移动图形。它不会移动到绝对位置,而是从图形现在的位置偏移。(使用 Relocate 移动到特定位置)

graph.MoveFigure(my_circle, 10, 10)

您还将使用此 ID 删除您绘制的单个图形:

graph.DeleteFigure(my_circle)

图形元素内的鼠标事件

如果您为图形元素启用了事件,那么您可以接收鼠标单击事件。如果您drag_submits在创建图形元素时另外启用,那么当您在窗口内“拖动”时也会收到事件。“拖动”定义为按下左键然后移动鼠标。

当拖动事件发生时,该事件将成为 Graph Element 的键。values 字典中value返回的是当前鼠标 (x,y) 位置的元组。

这意味着您将获得事件的“流”。如果鼠标移动,您将获得至少 1 个事件,并且可能会超过 1 个事件。

拖动鼠标向上事件

当您drag_submits启用时,会出现一个棘手的情况......当您完成拖动并且松开鼠标按钮时会发生什么?“Mouse Up”事件如何转发回您的代码。

“Mouse Up”将为您生成一个值为: Graph_key+的事件'+UP'。因此,如果您的 Graph Element 有一个键'_GRAPH_',那么当您释放鼠标按钮时您将收到的事件是: '_GRAPH_+UP'

是的,这有点奇怪,但它确实有效。这也很简单。在处理这些类型的字符串值时,我建议使用.startswith.endswith内置函数。

下面是通过在 Graph 元素内单击并拖动键 == 'graph' 生成的events和的示例:values dictionary

graph {'graph': (159, 256)}
graph {'graph': (157, 256)}
graph {'graph': (157, 256)}
graph {'graph': (157, 254)}
graph {'graph': (157, 254)}
graph {'graph': (154, 254)}
graph {'graph': (154, 254)}
graph+UP {'graph': (154, 254)}

表格元素

表和树元素是 PySimpleGUI 中最复杂的。他们有很多选择和很多不寻常的特征。

window.read() 从表元素返回值

调用表元素返回的值Window.read是当前突出显示的行号列表。

QtTable.Get()调用

PySimpleGUIQt中的新功能是添加了Table方法Get。此方法返回当前在 GUI 中显示的表。为了获得用户可能对表格进行的任何编辑,需要此方法。

对于 tkinter 端口,它将返回创建表时传入的相同值,因为用户无法修改 tkinter 表(如果您知道方法,请提交问题)。

已知的Table可视化问题......

有一个难以捉摸的问题,点击表头或靠近表头会导致 tkinter 在您移动鼠标时发疯并不断调整列的大小。

Table这个问题自元素第一次发布以来就存在。它已在 4.3 版中修复。

Python 3.7.3、3.7.4、3.8 中的已知表格颜色?

在过去几个 Python 版本中发布的 tkinter 有一个错误。所有类型的表格颜色都不起作用。行的背景永远不会改变。如果这对您很重要,您将需要降级您的 Python 版本。3.6 与 PySimpleGUI 和 tkinter 配合得非常好。

空表

如果您希望将表作为空表开始,则需要指定一个空表。此列表推导将创建一个包含 15 行和 6 列的空表。

data = [['' for row in range(15)]for col in range(6)]

表中的事件

有两种方法可以获取从表元素生成的事件。 change_submits单击一行 bind_return_key时生成的事件 双击一行或在一行上按下返回键时生成事件。

树元素

树元素和表格元素是近亲。表元素中的许多参数适用于树元素。特别是标题信息、列宽等。

与表格不同,树没有标准格式。因此必须构造传递给树元素的数据结构。这是使用 TreeData 类完成的。过程如下:

获取 TreeData 对象
将数据“插入”到树中
将填充的 TreeData 对象传递给 Tree Element

树数据格式

def TreeData()
def Insert(self, parent, key, text, values, icon=None)

为了将数据“插入”到树中,调用 TreeData 方法 Insert。

Insert(parent_key, key, display_text, values)

要指示在树的头部插入,请使用 "" 的父键。因此,树中的每个顶级节点都会有一个父节点 = ""

此代码创建一个 TreeData 对象并填充 3 个值

treedata = sg.TreeData()

treedata.Insert("", '_A_', 'A', [1,2,3])
treedata.Insert("", '_B_', 'B', [4,5,6])
treedata.Insert("_A_", '_A1_', 'A1', ['can','be','anything'])

请注意,您可以对 display_text 和键使用相同的值。您唯一需要注意的是您不能重复键。

读取窗口时,表格元素将返回用户选择的行列表。如果未选择任何行,则列表将为空。

树条目上的图标

如果您希望在树项目旁边显示一个图标,那么您在调用中指定图标Inserticon您可以使用可选参数传入文件名或 Base64 字节字符串。

这是显示带有树条目的图标的结果。

pysimplegui之画布,图形,表格和树结构元素的相关教程结束。

《pysimplegui之画布,图形,表格和树结构元素.doc》

下载本文的Word格式文档,以方便收藏与打印。