pysimplegui之常用元素介绍

 

1文本元素 | T == Txt == Text

2多行文本sg.Multiline('This is what a Multi-line Text Element looks like', size=(45,5))

 

Window.FindElement(key) 缩短为 Window[key]

基本元素。它显示文本。

layout = [
            [sg.Text('This is what a Text Element looks like')],
         ]

简单的文字

创建稍后将更新的文本元素时,请确保为新文本保留足够的字符。当创建一个没有大小参数的文本元素时,它会被创建为完全适合所提供的字符。

快捷键功能

TextareTxt和的简写函数T

活动 enable_events

如果您设置参数enable_events,那么如果用户单击文本,您将收到一个事件。

多行元素

此元素兼作输入和输出元素。

layout = [[sg.Multiline('This is what a Multi-line Text Element looks like', size=(45,5))]]

多行

随着时间的推移,这个元素已经被扩展了很多。其中两个更令人兴奋的补充是

  • 能够基于每个字符输出独特的文本和背景颜色
  • print允许您轻松地将正常打印的输出重新路由到多行元素的方法

Multiline.print()调用是使用与调用相同的元素查找技术进行的update。这些查找之一通常出现:

window['-MULTILINE KEY-']

要将您的正常打印之一更改为输出到您的多行元素,您只需将上述查找表达式添加到您的打印语句的前面。

print('My variables are', a, b, c)       # a normal print statement

window['-MULTILINE KEY-'].print('My variables are', a, b, c)     # Routed to your multiline element

它变得更好......你可以为你的照片添加颜色

# Outputs red text on a yellow background
window['-MULTILINE KEY-'].print('My variables are', a, b, c, text_color='red', background_color='yellow')

重新定义打印

使用此打印功能的另一种方法是重新定义print语句本身。这将允许您完全保留您的代码。通过添加这行代码,您的整个程序会将所有打印信息输出到多行元素。

print = lambda *args, **kwargs: window['-MULTILINE KEY-'].print(*args, **kwargs)

 

3组合元素 | Combo == InputCombo == DropDown == Drop

也称为下拉列表。唯一需要的参数是选项列表。返回值是与 GUI 上可见内容匹配的字符串。

layout = [[sg.Combo(['choice 1', 'choice 2'])]]

组合框

4列表框元素

您可以在大多数 GUI 中找到标准列表框。请注意,此元素的返回值将是结果列表,而不是单个结果这是因为用户可以从列表中选择超过 1 个项目(如果您设置了正确的模式)。

layout = [[sg.Listbox(values=['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(30, 6))]]

列表框 2


ListBoxes 可以使窗口从 Read 调用中返回。如果设置了标志

enable_events=TURE,则当用户进行选择时,读取立即返回。

如果设置了标志

bind_return_key=TURE,ListBoxes 可能导致读取返回的另一种方式。如果为 True,则如果用户在选择条目时按下返回键,则 Read 返回。此外,如果设置了这个标志,如果用户双击一个条目,它将从读取返回。

5滑块元素sg.Slider

滑块有几个特定于滑块的设置以及外观设置。示例包括orientationrange设置。

layout = [[sg.Slider(range=(1,500),
         default_value=222,
         size=(20,15),
         orientation='horizontal',
         font=('Helvetica', 12))]]

滑块

Qt 滑块

Qt 和 tkinter 滑块之间有一个重要的区别。在 Qt 上,滑块值必须是整数,而不是浮点数。如果您希望滑块从 0.1 变为 1.0,则让滑块从 1 变为 10 并除以 10。这是一个简单的数学运算,没什么大不了的。处理它....毕竟你是在写软件。想必你知道如何做这些事情。;-)

6单选按钮元素

创建一个分配给一组单选按钮的单选按钮。一次只能选择组中的 1 个按钮。

layout =  [
    [sg.Radio('My first Radio!', "RADIO1", default=True),
    sg.Radio('My second radio!', "RADIO1")]
]

收音机

7复选框元素 | CBox == CB == Check

复选框元素类似于单选按钮元素。它们返回一个布尔值,指示它们是否被检查。

layout =  [[sg.Checkbox('My first Checkbox!', default=True), sg.Checkbox('My second Checkbox!')]]
W[KEY].Get得到当前状态

复选框

8自旋元件

向上/向下微调器控件。有效值作为列表传入。

layout =  [[sg.Spin([i for i in range(1,11)], initial_value=1), sg.Text('Volume level')]]

微调器

9图像元素

图像可以放在您的窗口中,只要它们是 PNG、GIF、PPM/PGM 格式。无法显示 JPG,因为 tkinter 并不天真地支持 JPG。如果图像是 JPG 格式,则可以在调用 PySimpleGUI 之前使用 Python 图像库 (PIL) 包将图像转换为 PNG。

layout = [
            [sg.Image(r'C:\PySimpleGUI\Logos\PySimpleGUI_Logo_320.png')],
         ]

图片

您可以将动画 GIF 指定为图像,并可以通过调用UpdateAnimation令人兴奋的东西!

加载动画

您可以在不设置值的情况下调用该方法time_between_frames,它将显示一个帧并立即移动到下一帧。这使您能够进行帧间定时。

10按钮元素

按钮是最重要的元素!它们导致大部分动作发生。毕竟,这是一个按钮,可以让你离开一个窗口,无论是提交还是取消,所有窗口都包含一个按钮。唯一的例外是当用户使用右上角的“X”关闭窗口时,这意味着不涉及任何按钮。

按钮类型包括: * 文件夹浏览 * 文件浏览 * 文件浏览 * 文件另存为 * 文件保存 * 关闭窗口(普通按钮) * 阅读窗口 * 实时 * 日历选择器 * 颜色选择器

关闭窗口 - 提交、取消、是、否等普通按钮,不要关闭窗口......他们曾经这样做过。现在要关闭一个窗口,您需要使用 CloseButton / CButton。

文件夹浏览 - 单击时打开文件夹浏览对话框。文件夹浏览对话框的结果被写入窗口的输入字段之一。

文件浏览 - 与文件夹浏览相同,但不是选择文件夹,而是选择单个文件。

日历选择器 - 打开图形日历以选择日期。

颜色选择器 - 打开颜色选择器对话框

读取窗口 - 这是一个窗口按钮,它将读取所有输入字段的快照,但在单击后不会关闭窗口。

实时 - 这是另一个异步窗口按钮。释放按钮的单击后会发生正常的按钮单击。实时按钮在按钮被按住的整个过程中报告一次点击。

大多数程序将使用快捷键调用(提交、取消等)、使窗口保持打开状态的普通按钮和单击时关闭窗口的关闭按钮的组合。

有时同一个函数有多个名称。这只是为了让程序员的工作更快更容易。或者它们是不再使用但保留的旧名称,以便现有程序不会中断。

PySimpleGUI 按钮的 4 个主窗口及其名称是:

  1. ButtonReadButtonRButtonReadFormButton(使用Button,其他都是老方法)
  2. CloseButton = CButton
  3. RealtimeButton
  4. DummyButton

您会在旧程序中找到长格式名称。以阅读按钮为例。

2018 年 10 月,Button 的定义发生了变化。以前 Button 在单击时会关闭窗口。它已被更改,因此 Button 调用将使窗口以与 ReadButton 完全相同的方式保持打开状态。他们现在是同一个电话。为了使窗口能够使用按钮关闭,添加了一个新按钮...CloseButtonCButton

您的 PySimpleGUI 程序很可能只包含Button调用。其他的一般不会在用户代码中找到。

最基本的 Button 元素调用是 Button

layout =  [[sg.Button('Ok'), sg.Button('Cancel')]]

好的 取消 3

你很少会看到这 2 个按钮是这样写的。回想一下,PySimpleGUI 专注于您(这通常直接意味着......减少打字)。因此,上述窗口的代码通常使用下一节中的快捷方式编写。

您通常会看到这个而不是调用Button

layout =  [[sg.Ok(), sg.Cancel()]]

实际上Button,实际上是代表您被调用。在幕后,将文本设置为调用sg.Ok并返回结果,然后进入布局。如果您要打印布局,它将看起来与在布局中特别显示的第一个布局相同。sg.CancelButtonOkCancelButton

TTK 按钮和 Mac

2019 年增加了对 ttk 按钮的支持。这解决了无法在 Mac 上更改按钮颜色的问题。有很多地方可以控制是否使用 ttk 按钮,无论是在 MAC 还是其他平台上。

TTK 按钮和 TK 按钮的操作略有不同。按钮突出显示是一种不同。如何同时显示图像和文本是另一回事。你现在有了以前没有的选择。很高兴看到 Mac 用户终于可以使用颜色主题了。

按钮元素快捷方式

这些预制按钮是所有元素中最重要的元素,因为它们被大量使用。它们基本上都做同样的事情,设置按钮文本以匹配函数名称并将参数设置为常用值如果您发现自己经常需要创建自定义按钮,因为它不在此列表中,请在 GitHub 上发布请求。他们包括:

  • 行ok
  • 提交submit
  • 取消cancer
  • 是的yes
  • 不no
  • 退出exit
  • 退出quit
  • 帮助help
  • 保存save
  • 另存为saveas
  • 打开open    首字母都大写

“选择器”按钮

这些按钮用于显示选择填充到元素中的文件名、日期、颜色等的对话框InputText(或其他一些“目标”......关于目标,请参见下文)

  • 日历按钮
  • CalendarButton
  • 颜色选择按钮
  • ColorChooserButton
  • 文件浏览
  • FileBrowse
  • 文件浏览
  • FilesBrowse
  • 文件另存为
  • FileSaveAs
  • 文件夹浏览
  • FolderBrowse

关于快捷按钮的导入说明 在 3.11.0 版本之前,这些按钮关闭了窗口。从 3.11 开始,他们不会关闭窗口。它们的行为类似于 RButtons(返回按钮文本并且不关闭窗口)

如果您在关闭窗口时遇到这些按钮问题,请pip list在命令提示符下键入以检查您安装的 PySimpleGUI 版本。在 3.11 之前,这些按钮会关闭您的窗口。

使用旧版本,如果您想要一个不关闭窗口的 Submit() 按钮,那么您将改为使用 RButton('Submit')。使用新版本,如果您想要一个像已售出的 Submit() 调用那样关闭窗口的提交按钮,您可以将其写为CloseButton('Submit')CButton('Submit')

按钮目标

FileBrowseFolderBrowseFileSaveAsFilesSaveAs,按钮CalendarButtonColorChooserButton将值填充到位于窗口上的另一个元素中。目标可以是文本元素或 InputText 元素或按钮本身。元素的位置由target函数调用中的变量指定。

目标有两种形式。1. 键 2.(行、列)

使用键指定的目标将通过使用目标的键值来查找其目标元素。这是“首选”方法。

如果使用(行,列)指定目标,则它使用网格系统。GUI 中的行从 0 开始编号。目标可以指定为硬编码网格项,也可以与按钮相关。

(row, col) 定位只能定位同一“容器”中的元素。容器是窗口、列和框架元素。位于列内部的文件浏览按钮无法定位该列之外的元素。

target的默认值为(ThisRow, -1)。 ThisRow是一个特殊值,它告诉 GUI 使用与按钮相同的行。Y 值 -1 表示按钮左侧的字段一值。对于文件或文件夹浏览按钮,大多数情况下,它填充的字段通常位于按钮的左侧。(ThisRow, -1) 表示按钮左侧的元素,在同一行。

如果(None, None)为目标选择了值,则按钮本身将保存信息。稍后可以使用按钮的键查询按钮的值。

让我们以这个窗口为例:

文件浏览

InputText元素位于 (1,0)... 第 1 行,第 0 列。按钮Browse位于 (2,0) 位置。按钮的目标可以是以下任何值:

Target = (1,0)
Target = (-1,0)

整个窗口的代码可能是:

layout = [[sg.T('Source Folder')],
              [sg.In()],
              [sg.FolderBrowse(target=(-1, 0)), sg.OK()]]

或者如果使用键,那么代码将是:

layout = [[sg.T('Source Folder')],
              [sg.In(key='input')],
              [sg.FolderBrowse(target='input'), sg.OK()]]

看看关键方法有多容易?

隐形目标

一个非常方便的技巧是让你的目标不可见。这将删除编辑所选值的能力,就像您通常可以使用输入元素一样。这是一种让事物看起来更干净、更整洁的方法。

保存和打开按钮

有 4 种不同类型的文件/文件夹打开对话框可用。如果您正在寻找要打开的文件,这FileBrowse就是您想要的。如果要保存文件,SaveAs是按钮。如果要获取文件夹名称,则FolderBrowse使用按钮。要一次打开多个文件,请使用FilesBrowse按钮。它将创建一个由';'分隔的文件列表

打开

文件夹

另存为

日历按钮

这些按钮会弹出一个日历选择器窗口。所选日期以字符串形式返回。

日历

颜色选择器按钮

这些按钮会弹出一个标准的颜色选择器窗口。结果作为元组返回。返回值之一是 RGB 十六进制表示。

颜色

自定义按钮

并非所有按钮都是一样的。关闭窗口的按钮不同于从窗口返回而不关闭它的按钮。如果您想定义自己的按钮,通常会使用 Button Element 来执行此操作Button,它会在单击时关闭窗口。

layout =  [[sg.Button('My Button')]]

按钮

所有按钮都可以通过更改button_text按钮调用中的参数来更改其文本。读取窗口时返回的正是此文本。该文本将告诉您单击了哪个按钮。但是,您也可以在按钮上使用键,以便它们是唯一的。如果只使用文本,您将永远无法在同一个窗口中使用相同文本的 2 个按钮。

layout =  [[sg.Button('My Button', key='_BUTTON_KEY_')]]

使用此布局,Window.read()单击按钮时从调用返回的事件将是“ _BUTTON_KEY_

按钮图像

现在这是许多简化包中没有的令人兴奋的功能......按钮上的图像!借助一些按钮图像,您可以制作出非常漂亮的用户界面。

这是将 tkinter 从“1990 年代的 GUI”转变为“现代 GUI”的最快和最简单的方法之一。如果您不喜欢默认按钮,那么只需带上您自己的按钮图像并使用它们来代替。

您的按钮图像需要采用 PNG 或 GIF 格式。当您使用图像制作按钮时,请将按钮背景设置为与背景相同的颜色。您可以通过调用获取主题的背景颜色theme_background_color()

TRANSPARENT_BUTTON-重要- 这是一个具有误导性的遗留值。它目前被定义为这个常数值:

TRANSPARENT_BUTTON = ('#F0F0F0', '#F0F0F0')

如您所见,它只是 2 种灰色的元组。效果是按钮文本和按钮背景颜色为特定的灰色阴影。时光倒流,在您更改背景颜色并且所有窗口都为灰色之前,此值有效。但是现在您的按钮可以使用任何背景颜色,您需要设置按钮颜色以匹配背景,以便您的按钮与背景颜色混合。

sg.Button('Restart Song', button_color=(sg.theme_background_color(), sg.theme_background_color()),
               image_filename=image_restart, image_size=(50, 50), image_subsample=2, border_width=0)

Button用于按钮图像的元素中有几个参数。

image_filename - Filename of image. Can be a relative path
image_data - A Base64 image
image_size - Size of image in pixels
image_subsample - Amount to divide the size by.  2 means your image will be 1/2 the size.  3 means 1/3

这是一个使用按钮图像制作的示例窗口。

媒体文件播放器

您可以在文件 Demo Media Player 中找到源代码。这是创建媒体播放器窗口的按钮调用的样子

```python sg.Button('Pause', button_color=(sg.theme_background_color(), sg.theme_background_color()), image_filename=image_pause, image_size=(50, 50), image_subsample=2, border_width=0)


Experimentation is sometimes required for these concepts to really sink in and they can vary depending on the underlying GUI framework.

Button Images do work so play with them.  You can use PIL to change the size of your images before passing to PySimpleGUI.

### Realtime Buttons

Normally buttons are considered "clicked" when the mouse button is let UP after a downward click on the button.  What about times when you need to read the raw up/down button values.  A classic example for this is a robotic remote control.  Building a remote control using a GUI is easy enough.  One button for each of the directions is a start.  Perhaps something like this:

![robot remote](https://user-images.githubusercontent.com/13696193/44959958-ff9b7000-aec4-11e8-99ea-7450926409be.jpg)

This window has 2 button types.  There's the normal "Read Button" (Quit) and 4 "Realtime Buttons".

Here is the code to make, show and get results from this window:

```python
import PySimpleGUI as sg

gui_rows = [[sg.Text('Robotics Remote Control')],
            [sg.T(' '  * 10), sg.RealtimeButton('Forward')],
            [sg.RealtimeButton('Left'), sg.T(' '  * 15), sg.RealtimeButton('Right')],
            [sg.T(' '  * 10), sg.RealtimeButton('Reverse')],
            [sg.T('')],
            [sg.Quit(button_color=('black', 'orange'))]
            ]

window = sg.Window('Robotics Remote Control', gui_rows)

#
# Some place later in your code...
# You need to perform a Read or Refresh call on your window every now and then or
# else it will apprear as if the program has locked up.
#
# your program's main loop
while (True):
    # This is the code that reads and updates your window
    event, values = window.read(timeout=50)
    print(event)
    if event in ('Quit', sg.WIN_CLOSED):
        break

window.close()  # Don't forget to close your window!

此循环将读取按钮值并打印它们。当单击实时按钮之一时,调用window.read将返回一个按钮名称,该名称与按下的按钮上的名称相匹配,或者如果有一个键分配给该按钮,则返回该键。只要按钮保持按下状态,它将继续返回值。释放后,Read 将返回超时事件,直到再次单击按钮。

文件类型FileBrowse&按钮有一个名为 的SaveAs附加设置file_types此变量用于过滤文件对话框中显示的文件。此设置的默认值为

FileTypes=(("ALL Files", "*.*"),)

此代码生成一个窗口,其中“浏览”按钮仅显示 .TXT 类型的文件

layout =  [[sg.In() ,sg.FileBrowse(file_types=(("Text Files", "*.txt"),))]]

注意 - Mac 用户将无法使用 file_types 参数。tkinter 在 Mac 上有一个错误,如果尝试使用 file_type,程序会崩溃,因此必须删除该功能。对于那个很抱歉!

ENTER 键 ENTER 键是windows 数据输入的重要部分。使用回车键快速提交窗口的传统由来已久。PySimpleGUI 通过将 ENTER 键绑定到关闭或读取窗口的第一个按钮来实现这一点。

Enter 键可以“绑定”到特定按钮,以便当按下该键时,它会导致窗口返回,就像单击该按钮一样。这是使用bind_return_key按钮调用中的参数完成的。如果窗口上有多个按钮,则使用类型为关闭窗口或读取窗口的第一个按钮。首先是通过扫描窗口确定的,从上到下,从左到右。

11按钮菜单元素

ButtonMenu 元素产生一种独特的效果。这是一个按钮,点击后会显示一个菜单。这就像单击 MenuBar 上的顶级菜单项之一。结果,菜单定义采用来自普通菜单定义的单个菜单条目的格式。一个普通的菜单定义是一个列表列表。该定义是这些列表之一。

 ['Menu', ['&Pause Graph', 'Menu item::optional_key']]

第一个字符串通常指定菜单栏上显示的内容。在这种情况下,不使用该值您使用不同的参数button_textparm 设置按钮的文本。

此元素的一种用途是制作具有彩色背景的“假菜单栏”。普通菜单栏不能更改其背景颜色。ButtonMenus 并非如此。

按钮菜单

ButtonMenus 的返回值通过返回值字典发送。如果进行了选择,则会生成一个事件,该事件将等于 ButtonMenu 的键值。使用该键值来查找用户选择的值。这与菜单栏元素的机制相同,但与弹出(右键单击)菜单不同。

12垂直分隔符元素

该元素的用处有限,并且为了完整性而被包括在内。它将在元素之间画一条线。

当放置在跨多行的列或元素之间时效果最佳。如果在“正常”行上的元素只有 1 行高,那么它将只跨越那一行。

VerticalSeparator(pad=None)

snag-0129

13水平分隔符元素

在 tkinter 端口 PySimpleGUI 中,没有HorizontalSeparator元素。一个将作为“存根”添加,以便代码可移植。它可能不会像StretchElement 那样做任何事情。

在 PySimpleGUI 中获得水平线的一种简单方法是使用Text包含一行下划线的元素

sg.Text('_'*30)             # make a horizontal line stretching 30 characters

14进度条元素

ProgressBar元素用于构建自定义进度条窗口。强烈建议您使用为您提供完整进度表解决方案的 OneLineProgressMeter。进度表不容易使用,因为窗口必须是非阻塞的,而且调试起来很棘手。

进度条添加到代码中的最简单OneLineProgressMeter方法是使用API。这由一对函数OneLineProgressMeter和组成OneLineProgressMeterCancel您可以通过使用当前值 = 最大值调用任何进度表来轻松取消它。这会将仪表标记为过期并关闭窗口。您已经看过本自述文件前面介绍的 OneLineProgressMeter 调用。

sg.OneLineProgressMeter('My Meter', i+1, 1000,  'key', 'Optional message')

的返回值为OneLineProgressMeter: 如果用户单击取消按钮、关闭窗口或 vale 达到最大值,True则仪表更新正确 。False

窗口中的进度表

将进度表与 PySimpleGUI 一起使用的另一种方法是在窗口中构建一个带有ProgressBar元素的自定义窗口。您需要将窗口作为非阻塞窗口运行。当您准备好更新进度条时,您可以调用元素本身的UpdateBar方法。ProgressBar

import PySimpleGUI as sg

# layout the window
layout = [[sg.Text('A custom progress meter')],
          [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')],
          [sg.Cancel()]]

# create the window`
window = sg.Window('Custom Progress Meter', layout)
progress_bar = window['progressbar']
# loop that would normally do something useful
for i in range(1000):
    # check to see if the cancel button was clicked and exit loop if clicked
    event, values = window.read(timeout=10)
    if event == 'Cancel'  or event == sg.WIN_CLOSED:
        break
  # update bar with loop value +1 so that bar eventually reaches the maximum
    progress_bar.UpdateBar(i + 1)
# done with loop... need to destroy the window as it's still open
window.close()

进度定制

15输出元件

输出元素是标准输出的重定向。

如果您正在寻找一种方法来快速添加在窗口中显示滚动文本的功能,那么添加Output元素将尽可能快速和简单。

任何“打印”的内容都将显示在此元素中。 这是在窗口中显示滚动文本的“简单”方式。这就像将一个输出元素放到您的窗口中然后尽可能多地调用 print 一样简单。用户将在其窗口内看到文本的滚动区域。

重要事项print在您调用window.read 不会看到您window.Refresh如果您想立即查看打印的内容,请window.Refresh()在您的打印语句之后立即调用。

Output(size=(80,20))

输出


这是使用输出元素的聊天窗口的完整解决方案。要显示接收到的数据,您只需“打印”它,它就会显示在输出区域中。您会发现在包括 HowDoI 应用程序在内的多个演示程序中使用了这种技术。

import PySimpleGUI as sg

def ChatBot():
    layout = [[(sg.Text('This is where standard out is being routed', size=[40, 1]))],
              [sg.Output(size=(80, 20))],
              [sg.Multiline(size=(70, 5), enter_submits=True),
               sg.Button('SEND', button_color=(sg.YELLOWS[0], sg.BLUES[0])),
               sg.Button('EXIT', button_color=(sg.YELLOWS[0], sg.GREENS[0]))]]

    window = sg.Window('Chat Window', layout, default_element_size=(30, 2))

    # ---===--- Loop taking in user input and using it to query HowDoI web oracle --- #
    while True:
        event, value = window.read()
        if event == 'SEND':
            print(value)
        else:
            break
    window.close()
ChatBot()

使用比例间隔字体(通常是默认字体),即使一组字符的字符数相同,一组字符的像素大小也会不同于另一组字符的像素大小。换句话说,并非所有字母都使用相同数量的像素。看看你现在正在阅读的文本,你会看到这一点。“i”占用的空间比“A”少。


Window.FindElement(key) 缩短为 Window[key]

在使 PySimpleGUI 代码更紧凑方面取得了惊人的飞跃。

而不是写:

window.FindElement(key).update(new_value)
 ```

You can now write it as:

```python
window[key].update(new_value)
 ```

This change has been released to PyPI for PySimpleGUI

MANY Thanks is owed to the nngogol that suggested and showed me how to do this.  It's an incredible find as have been many of his suggestions.

## `Element.update()` ->  `Element()` shortcut

This has to be one of the strangest syntactical constructs I've ever written.

It is best used in combination with `FindElement` (see prior section on how to shortcut `FindElement`).

Normally to change an element, you "find" it, then call its `update` method.  The code usually looks like this, as you saw in the previous section:

```python
window[key].update(new_value)

可以通过删除.update字符来进一步压缩代码,从而得到这个看起来非常紧凑的调用:

window[key](new_value)

是的,这是 Python 中的有效语句。

正在发生的事情是元素本身被调用。你也可以这样写:

elem = sg.Text('Some text', key='-TEXT-')
elem('new text value')

旁注 - 您也可以window直接调用您的变量。如果您“调用”它,它实际上会调用Window.read.

window = sg.Window(....)
event, values = window()

# is the same as
window = sg.Window(....)
event, values = window.read()

但是看起来令人困惑,因此在使用时,最好在语句的末尾写一个注释以帮助落后的可怜的初学者程序员。

因为它是一个陌生的结构,上过 1 周 Python 课程的人都认不出来,所以 demo 将继续使用该.update方法。

它不必与 结合使用FindElement该调用适用于任何先前制作的元素。有时会创建元素并将其存储到变量中,然后在布局中使用该变量。例如。

graph_element = sg.Graph(...... lots of parms ......)

layout = [[graph_element]]
.
.
.
graph_element(background_color='blue')      # this calls Graph.update for the previously defined element

希望这不会太令人困惑。请注意,这些快捷方式替换的方法不会被删除。您可以继续使用旧结构而无需更改。


字体

已经在通用参数部分讨论过。字符串或元组。

PySimpleGUI 中的颜色是两种格式之一 - 颜色名称或 RGB 值。

使用 tkinter 中定义的颜色名称或此格式的 RGB 字符串指定单个颜色:

"#RRGGBB"        or          "darkblue"

auto_size_text

Trueauto_size_text,当放置在文本元素上时,表示元素的宽度应该缩小为文本的宽度。默认设置为真。Text当您创建用于输出的元素时,您需要记住这一点。

Text(key='-TXTOUT-)将创建一个Text长度为 0 的元素。请注意,对于具有空字符串的 Text 元素,不需要指定字符串值。字符串的默认值是''文本元素。在发布 4.45.0 之前,您需要为最长的字符串保留足够的空间。如果您尝试输出一个 5 个字符的字符串,它不会显示在窗口中,因为没有足够的空间。补救措施是手动将大小设置为您期望输出的大小

Text(size=(15,1), key='-TXTOUT-)创建一个Text可以容纳 15 个字符的元素。

对于较新的版本,在 4.45.0 之后,如果您根本不设置大小,即size=(None, None),那么Text元素将同时增长和缩小以适应文本,Window此外,如果您指示高度为,None则元素将在其中增长和缩小以匹配字符串。

元素现在的工作方式Text是真正自动调整大小的。

 12

菜单

从 3.01 版开始,您可以将 MenuBar 添加到您的窗口。您指定菜单的方式与使用列表的窗口布局非常相似。从 3.17 开始,菜单选择作为事件返回,在 values 字典中也是如此。返回的值将是整个菜单项,包括您指定的键。

    menu_def = [['File', ['Open', 'Save', 'Exit',]],
                ['Edit', ['Paste', ['Special', 'Normal',], 'Undo'],],
                ['Help', 'About...'],]

菜单

注意 ',' 和 [] 的位置。使嵌套菜单正确实现级联菜单是很棘手的。看看 paste 后面是如何将 Special 和 Normal 作为列表的。这意味着 Paste 有一个包含 Special 和 Normal 项的级联菜单。

方法


要将菜单添加到 Window 中,请将MenuorMenuBar元素放入布局中。

layout = [[sg.Menu(menu_def)]]

将菜单元素放在布局中的哪个位置并不重要,因为它始终位于窗口的顶部。

当用户选择一个项目时,它作为事件返回(如果在菜单定义中指定了一个,则与菜单项的键一起返回)

按钮菜单

按钮菜单是在 3.21 版中引入的,之前已在 PySimpleGUIQt 中发布。它们的工作方式完全相同,并且是 PySimpleGUI 和 PySimpleGUIQt 之间的源代码兼容。这些类型的菜单采用单个菜单条目,其中菜单栏采用菜单条目列表。

ButtonMenus 的返回值与菜单栏不同。

您将取回 ButtonMenu 的 KEY 作为事件。要选择实际项目,您将在值字典中查找它。这可以通过表达式来完成values[event]

右键菜单

右键菜单是在 3.21 版本中引入的。几乎每个元素都有一个 right_click_menu 参数,并且有一个用于丰富点击菜单的窗口级设置,它将为窗口中的所有元素附加一个右键菜单。

菜单定义与按钮菜单定义相同,为单个菜单项。

right_click_menu = ['&Right', ['Right', '!&Click', '&Menu', 'E&xit', 'Properties']]

忽略右键菜单和按钮菜单中的第一个字符串它不被使用。通常,您会将菜单栏上显示的字符串放在该位置。

右键单击菜单的返回值与 MenuBars 相同。 选择的值作为事件返回。

您曾在其他 Windows 程序中使用 ALT 键来导航菜单。例如 Alt-F+X 退出程序。Alt-F 下拉文件菜单。X 选择标记为 Exit 的条目。

好消息是 PySimpleGUI 允许您创建相同类型的菜单!你的程序可以和大男孩一起玩。而且,这很简单。

您只需在要显示的字母前添加一个“&”,并带有下划线。当您按住 Alt 键时,您将看到带有您标记的下划线的菜单。

您可以添加的另一点润色是列表中的分隔符。要在菜单选项列表中添加一行,请创建一个如下所示的菜单条目:'---'

这是一个带有下划线和分隔符的示例菜单。

# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', '---', 'Properties', 'E&xit'  ]],
            ['&Edit', ['Paste', ['Special', 'Normal',], 'Undo'],],
            ['&Help', '&About...'],]

这是它制作的精美菜单: 带有快捷方式的菜单

禁用的菜单项

如果您希望禁用其中一个菜单项,请放置一个“!” 在菜单项的前面。要禁用前面示例中的粘贴菜单条目,该条目将是: ['!&Edit', ['Paste', ['Special', 'Normal',], 'Undo'],]

如果您想从“!”更改禁用的菜单项标志/字符 换成别的东西,改变变量MENU_DISABLED_CHARACTER

菜单键

从 3.17 版开始,您可以将 a 添加key到您的菜单条目中。key值将在插入菜单之前被删除。当您接收到 Menu 事件时,将返回整个菜单项,包括key::通过在菜单条目后添加一个键来表示一个键,然后是键。

要添加key _MY_KEY_到特殊菜单条目,代码将是:

['&Edit', ['Paste', ['Special::_MY_KEY_', 'Normal',], 'Undo'],]

如果要将指示键后跟的字符从 '::' 更改为其他字符,请更改变量 MENU_KEY_SEPARATOR

菜单定义

通读菜单部分后,您可能已经注意到右键菜单和按钮菜单的格式有点奇怪,因为其中有一部分没有被使用(第一个字符串)。也许“未使用”这个词应该出现在示例中......但是,有理由保留那些有意义的词。

这样做的原因是架构上的,但它也给用户带来了方便。您可以将单个菜单项(按钮和右键单击)放入列表中,您将拥有一个菜单栏定义。

这可以从一系列这些单独的菜单定义中创建一个菜单栏:

menu_bar = [right_click_menu_1, right_click_menu_2, button_menu_def ]

当然,方向也相反。您可以使用菜单栏定义并拉出单个菜单项以创建右键单击或按钮菜单。

posted @ 2022-01-15 18:56  菩提浪子  阅读(2517)  评论(0编辑  收藏  举报