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))]]
    

    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 个主窗口及其名称是:

  • ButtonReadButtonRButtonReadFormButton(使用Button,其他都是老方法)
  • CloseButton = CButton
  • RealtimeButton
  • DummyButton
  • 您会在旧程序中找到长格式名称。以阅读按钮为例。

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

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

    最基本的 Button 元素调用是 Button

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

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

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

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

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

    TTK 按钮和 Mac

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

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

    按钮元素快捷方式

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

  • 提交submit
  • 取消cancer
  • 是的yes
  • 退出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)
    

    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()