pysimplegui之窗口大小,位子,主题等属性修改
重点
1finalize()
或Window
参数finalize=True
调用以强制窗口通过初始化的最后阶段。这将导致 tkinter 资源被分配,以便它们可以被修改。这也会导致您的窗口出现。如果您不希望在调用 Finalize 时出现窗口,则在窗口的创建参数中将 Alpha 设置为 0。
如果你想调用一个元素的Update
方法或调用一个Graph
元素的绘图图元,你必须在调用之前调用Read
或调用。Finalize
读取(超时=无,超时键=TIMEOUT_KEY,关闭=假)
以阻塞方式读取窗口的输入值和按钮点击
返回事件、值。添加超时可以通过设置 timeout=读取超时之前的毫秒数来实现,之后返回“超时事件”。timeout_key 的值将作为事件返回。如果您不指定超时键,则将TIMEOUT_KEY
返回该值。
如果设置 timeout = 0,则 Read 将立即返回,而不是等待输入或超时。这是对窗口的真正非阻塞“读取”。
2窗口主题
3窗口大小
4无窗口标题
5阻塞
正文
如果您使用诸如PyCharm之类的 IDE,您会发现使用 PySimpleGUI 编写代码要容易得多。向您显示有关您正在进行的 API 调用的文档的功能将帮助您确定要更改的设置(如果有)。在 PyCharm 中,有两个命令特别有用。
Control-Q (when cursor is on function name) brings up a box with the function definition
Control-P (when cursor inside function call "()") shows a list of parameters and their default values
同步/异步窗口
PySimpleGUI 最常见的用途是显示和收集来自用户的信息。最直接的方法是使用“阻塞”GUI 调用。在等待用户关闭 GUI 窗口/对话框时执行被“阻止”。
您已经在上面看到了许多使用阻塞窗口的示例。如果Read
调用没有超时参数,您会知道它会阻塞。
阻塞读取(等待事件发生)如下所示:
event, values = window.read()
非阻塞/异步读取调用如下所示:
event, values = window.read(timeout=100)
您可以在本文档末尾了解有关这些异步/非阻塞窗口的更多信息。
主题 - Windows 的自动着色
2019 年 12 月,该功能change_look_and_feel
被theme
. 这个概念保持不变,但一组新的函数调用使管理颜色和其他设置变得更加容易。
默认情况下,PySimpleGUI 颜色主题现在是Dark Blue 3
. “系统默认”灰色已经一去不复返了。如果您希望您的窗口没有所有颜色,以便系统为您选择颜色(灰色),则将主题设置为 'SystemDefault1' 或Default1
.
有 130 个主题可用。您可以通过调用来预览这些主题,theme_previewer()
这将创建一个显示所有可用颜色主题的大窗口。
在撰写本文时,这些是您可用的主题。
默认为 Dark Blue 3
在 2019 年 12 月,所有 PySimpleGUI 窗口的默认设置从带有蓝色按钮的系统灰色更改为使用带有白色文本的灰蓝色的更完整的主题。以前用户被唠叨选择灰色以外的颜色主题。现在它已经为你完成了,而不是唠叨你。
如果您正在为这种颜色主题而苦苦挣扎,请添加theme
对更改它的调用。
主题名称公式
您指定的主题名称可能是“模糊的”。文本不必与您看到的打印内容完全匹配。例如“Dark Blue 3”和“DarkBlue3”和“dark blue 3”都可以。
快速确定窗口最佳设置的一种方法是使用许多不同的主题简单地显示窗口。添加设置主题的代码行 - theme('Dark Green 1')
,运行您的代码,看看是否喜欢它,如果不喜欢,请将主题字符串更改为并重'Dark Green 2'
试。重复,直到你找到你喜欢的东西。
字符串的“公式”是:
Dark Color #
或者
Light Color #
颜色可以是蓝色、绿色、黑色、灰色、紫色、棕色、蓝绿色、红色。# 是可选的,或者可以是从 1 到 XX。有些颜色有很多选择。例如,有 13 个“浅棕色”选项。
“系统”默认值 - 无颜色
如果您一心想在窗口中完全没有颜色,请选择Default 1
或System Default 1
。
如果你想要一个蓝色按钮的原始 PySimpleGUI 配色方案,而其他一切都是灰色的,那么你可以使用主题Default
或System Default
.
主题功能
基本的主题函数调用是theme(theme_name)
. 这设定了主题。不带参数调用,theme()
将返回当前主题的名称。
如果您想获取或修改任何主题设置,您可以使用这些功能来完成,您可以在文档底部的功能定义部分找到有关这些功能的详细信息。如果不使用参数,每个都将返回当前值。
theme_background_color
theme_border_width
theme_button_color
theme_element_background_color
theme_element_text_color
theme_input_background_color
theme_input_text_color
theme_progress_bar_border_width
theme_progress_bar_color
theme_slider_border_width
theme_slider_color
theme_text_color
这些将帮助您获得可用选择的列表。
theme_list
theme_previewer
窗口对象 - 开始一个窗口
第一步是使用所需的窗口自定义创建窗口对象。
模态窗口(目前仅适用于 tkinter 端口
) 注意 - 从 PySimpleGUI 4.25.0 开始支持模态窗口!默认情况下popup
,阻塞的窗口将默认标记为模态。这是一个有点冒险的更改,因为您现有的应用程序的行为会有所不同。但是,理论上,当弹出窗口处于活动状态时,您不应该与其他窗口进行交互。所有这些动作充其量都是排队的。它依赖于实现。
在这种情况下,“模态”意味着您必须关闭此“模态”窗口,然后才能与在此窗口之前创建的窗口进行交互。考虑一个“关于”框。在大多数程序中,您通常必须关闭这个小弹出窗口。所以,这就是 PySimpleGUI 现在正在做的事情。
使您的窗口模态化
要制作模态 Wio=now,您有 2 个选项。
-
moodel=True
在 Window 调用中设置参数。 -
调用该方法
Window.make_modal()
将窗口从非模态变为模态。没有模态到非模态。看不出需要一个。如果有人出现,当然!
禁用模式窗口
阻止的弹出窗口是唯一默认打开模式的窗口。有一个模态参数,您可以将其设置为 False 以将其关闭。
对于 PySimpleGUI 4.25.0 之前的版本和其他端口 PySimpleGUI 中没有对“模态窗口”的直接支持。除非您手动更改窗口的设置,否则所有窗口都可以随时访问。
重要- 许多Window
方法要求您在调用方法之前调用Window.read
或Window.Finalize
(或finalize=True
在Window
调用中设置)。这是因为这两个调用实际上是使用底层 GUI 框架创建窗口的。在其中一个调用之前,这些方法可能会崩溃,因为它们还没有创建其底层小部件。
窗口位置
PySimpleGUI 计算窗口的精确中心并将窗口居中在屏幕上。如果您想将窗口定位到其他位置,例如系统默认值 (0,0),如果您有 2 种方法可以做到这一点。第一个是创建窗口的时候。使用location
参数设置窗口所在的位置。第二种方法是使用SetOptions
调用,它将为将来的所有窗口设置默认窗口位置。
多显示器和 Linux
如果您在 Linux 系统上有多个监视器,则 PySimpleGUI 窗口的自动居中(默认)位置可能不正确。在 Windows 上,多个监视器似乎可以作为 tkinter 使用和报告的主要监视器工作。
location
多显示器的 Linux 用户在使用默认位置运行时出现问题,需要通过设置参数来指定在创建窗口时应该放置窗口的位置。
窗口大小
您可以通过访问该Size
属性来获取窗口的大小。必须读取一次或完成窗口才能使值正确。请注意,它是一个属性,而不是一个调用。
my_windows_size = window.Size
要完成您的窗口:
window = Window('My Title', layout, finalize=True)
元素尺寸
有多种方法可以设置元素的大小。他们是:
- 全局默认大小 - 使用
SetOptions
函数更改 - 在窗口级别 - 使用
default_element_size
调用中的参数更改Window
- 在元素级别 - 每个元素都有一个
size
参数
元素大小以字符为单位(有例外)。文本元素 size = (20,1)
的大小为 20 个字符宽 x 1 个字符高。
PySimpleGUI 的默认元素大小是(45,1)
.
有几个小部件,其中一个大小值以像素而不是字符为单位。进度表和滑块也是如此。第二个参数是以像素为单位的“高度”。
没有标题栏
如果您希望创建没有窗口标题栏的干净的漂亮窗口,请在创建窗口时使用 no_titlebar 选项。
确保为您的用户提供“退出”按钮,否则他们将无法关闭窗口!当没有启用标题栏时,窗口的任务栏上将没有图标。如果没有退出按钮,您将需要通过任务管理器杀死......不好玩。
没有标题栏的窗口依赖于启用任意位置选项,否则您将无法移动窗口。
没有标题栏的 Windows 可用于轻松创建浮动启动器。
Linux 用户!请注意,此设置对其他一些元素有副作用。多行输入根本不起作用,例如所以,谨慎使用。
随处抓取
这是 PySimpleGUI 独有的功能。
注意 - 如果用户使用启用了 grab_anywhere 的按钮关闭非阻塞窗口,则会打印出一条警告消息。这些消息没有害处,但可能会让用户感到痛苦。如果您希望启用非阻塞窗口,只需在创建窗口时获取 grab_anywhere = True。
总在最前面
要将窗口保持在屏幕上所有其他窗口的顶部,请在创建窗口时设置 keep_on_top = True。此功能使浮动工具栏非常有用并且在您的桌面上始终可见。
重点
PySimpleGUI 将为您设置默认焦点位置。这通常意味着第一个输入字段。您可以将焦点设置到特定元素。use_default_focus=False
如果您要自己设置焦点,则应通过在 Window 调用中设置来关闭自动焦点。
TTK 按钮
从 4.7.0 版开始,PySimpleGUI 支持“普通”tk 按钮和 ttk 按钮。需要进行此更改,以便 Mac 用户可以在其按钮上使用颜色。当您尝试更改按钮颜色时,有一个错误会导致 tk 按钮不显示文本。请注意,如果您从官方 Python.org 站点而不是使用 Homebrew 安装 Python,这个问题就会消失。许多用户已经切换并且非常高兴,因为切换后甚至 tk 按钮都可以在 Mac 上运行。
默认情况下,当使用 Button Element 时,Mac 用户将获得 ttk Buttons。所有其他平台将获得一个正常的 tk 按钮。有一些方法可以覆盖此行为。use_ttk_buttons
一种是在创建窗口时使用参数。如果设置为 True,则所有按钮都将是窗口中的 ttk 按钮。如果设置为 False,则所有按钮都是普通的 tk 按钮。如果未设置,则平台或按钮元素确定使用哪个。
如果需要系统范围的设置,则可以使用 设置默认值set_options
。这将影响所有窗口,例如弹出窗口和调试窗口。
TTK 主题
tkinter 有许多可以与 ttk 小部件一起使用的“主题”。在 PySimpleGUI 中,这些小部件包括 - Table、Tree、Combobox、Button、ProgressBar、Tabs & TabGroups。一些元素有一个“主题”参数,但这些不再使用,应该被忽略。PySimpleGUI 的初始版本试图在单个窗口中混合主题,但由于了解到这是不可能的,因此它被设置在窗口或系统级别。
如果需要系统范围的设置,则可以使用 设置默认值set_options
。这将影响所有窗口,例如弹出窗口和调试窗口。
ttk 主题选择取决于平台。Linux 的选择数量少于 Windows。这些是 Windows 选项:'default'、'winnative'、'clam'、'alt'、'classic'、'vista'、'xpnative'
定义了一些常量来帮助您完成代码以确定您的选择。主题常量以THEME_
. 例如,“蛤”主题是THEME_CLAM
建议您尝试使用此设置来确定您最喜欢哪个设置。他们以微妙但仍然重要的方式改变了基于 ttk 的元素。
关闭窗口
当您完全完成一个窗口时,您应该关闭它然后删除它,以便正确清理资源,特别是 tkinter 资源。
如果您希望在 1 行代码中执行此操作,请执行以下操作:
window.close(); del window
删除有助于解决多线程应用程序遇到的问题,其中 tkinter 抱怨它是从错误的线程(不是程序的主线程)调用的
完成窗口形成的窗口方法
完成布局后,存储在layout
这些示例中调用的变量中,您将创建窗口。
窗口的创建部分涉及 3 个步骤。
- 创建一个
Window
对象 - 将布局添加到窗口
Read
可选 - 如果想在调用之前进行更改,请完成
随着时间的推移,PySimpleGUI 代码继续压缩、压缩,因此程序员需要编写尽可能少的代码。
个别电话
这是“长形式”,因为每个方法都是单独调用的。
window = sg.Window('My Title')
window.layout(layout)
window.finalize()
链接调用(旧方法)
完成的下一级压缩是将调用链接到一行代码中。
window = sg.Window('My Title').Layout(layout).finalize()
使用参数而不是调用(新的首选方法)
这是一个新颖的概念,而不是使用链接,对初学者来说是陌生的,而是使用参数来Window
调用。这正是 PySimpleGUI 端口 4.2 发生的情况。
window = sg.Window('My Title', layout, finalize=True)
与其将工作推给执行布局和完成调用的用户,不如让 Window 初始化代码为您完成。是的,现在听起来很明显,但几个月前还没有。
此功能已添加到所有 4 个 PySimpleGUI 端口,但 PyPI 上还没有一个,因为首先需要一些运行时来确保不会发生真正的坏事。
调用设置窗口布局。必须在 之前调用Read
。最有可能与 Window 创建“链接”。
window = sg.Window('My window title', layout)