画布元素

在我看来,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之画布,图形,表格和树结构元素的更多相关文章

  1. 【学习笔记】HTML基础:列表、表格与媒体元素

    一.列表是信息资源的一种展现形式,它可以使信息结构化和条理化,并以列表的样式显示出来,以便浏览者能够快速的获取相应的信息. 1.无需列表 <ul> <li>第一项</li ...

  2. HTML第二章:列表,表格,媒体元素

    第二章:列表,表格,媒体元素 列表:有三种,有序列表,无序列表,定义列表 1.有序列表:<ol></ol>            列表项:<li></li&g ...

  3. vue 表格阻止父元素冒泡事件

    思路如下:1.给复选框定义一个类型,type="selection" 2.在点击函数中就可以使用判断条件来进行复选框的阻止冒泡.rowDetailShow(row, event, ...

  4. HTML5 第二章 列表和表格和媒体元素

    列表: (1)什么是列表? 列表就是信息资源的一种展示形式. (2)无序列表: 语法: <ul> <li>第1项</li> <li>第2项</li ...

  5. HTML列表,表格与媒体元素

    一.列表  信息资源的一种展示形式   二.列表的分类  1.有序列表   <ol>    <li>列表项1</li>    <li>列表项2</ ...

  6. HTML的列表,表格与媒体元素

    一.无序列表 <ul>                            <li>无序列表</li>                            &l ...

  7. HTML5 列表、表格、媒体元素

    无序列表 <ul> <li>范冰冰演藏族女孩</li> <li>拍集体合影后自拍</li> <li>诗隆甜蜜出游</li& ...

  8. HTML列表,表格与媒体元素

    一.无序列表 <ul> <li>无序列表</li> <li>有序列表</li> <li>自定义列表</li> < ...

  9. HTML表格中各元素之间属性之间的相互影响

    开发了一个动态表格制作程序,用的是谷歌浏览器.发现几个现象,记录如下: 1.按照技术文档的说法,正规的表格样式如下: <table> <caption>标题</capti ...

  10. html/css 表格元素以及表格布局

    一,html之表格 1,一个完整的html表格所包含的元素 <!--一个完整的html表格--> <!--cellpadding代表单元格内的文字和单元格边框之间的间距--> ...

随机推荐

  1. HDFS相关问题处理

    机房搬迁后datanode启动失败,报错如下: 2022-10-21 10:28:40,551 INFO org.apache.hadoop.hdfs.server.common.Storage: L ...

  2. SpingBoot面试大汇总

    1.什么是SpringBoot? 1)用来优化Spring应用的初始搭建以及开发过程,使用特定的方式来配置(properties和yml文件) 2)嵌入式的内置服务器tomcat无需部署war文件简化 ...

  3. LeetCode刷题感想之BFS

    BFS, 顾名思义,广度优先遍历,与DFS对应. 最大的一个区别是,在解题套路里,DFS 多数使用 List<List<Object>> 的方式来保存结果集,并且最后删除回溯的 ...

  4. jetson nano 2gb相关问题

    1.create_ap不能根据address设置带设备号的wifi热点 sudo nohup create_ap wlan0 eth0 ZL_Jetson_WIFI-$(sudo cat /sys/c ...

  5. js 实现全屏预览(F11功能)--转

    参考文档   http://t.zoukankan.com/ghfjj-p-6322415.html HTML代码 <body> <div id="content" ...

  6. 【转载】python:获取当前目录、上层目录路径

    import os print("===获取当前文件目录===")# 当前脚本工作的目录路径print(os.getcwd())# os.path.abspath()获得绝对路径p ...

  7. 1012.Django中间件以及上下文处理器

    一.中间件 中间件的引入: Django中间件(Middleware)是一个轻量级.底层的"插入"系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出. d ...

  8. El_获取域中存储的值和El_获取域中存储的值_对象值

    2获取值 1.el表达式只能从域对象中获取值 2语法: 1.$[域名称.键}:从指定域中获取指定键的值域名称:1.pageScope2.requestScope 3.sessionScope 4.ap ...

  9. Codeforces Round #803 (Div. 2) A-D 刚vp完还没补题

    Codeforces Round #803 (Div. 2) 2022/7/24 上午VP 传送门:https://codeforces.com/contest/1698 A. XOR Mixup 随 ...

  10. Jmeter--请求结果写入文件并生成报告

    一.数据写入文件 Jmeter中监听器控件中,都可以将"所有数据写入一个文件",且文件形式有:xml\jtl\csv 在需要写入的监听器下点击"浏览"按钮,选择 ...