PySimpleGUI - 窗口类


弹出窗口具有按钮、文本标签和文本输入字段的预定义配置。Window 类允许您设计更灵活的 GUI。除了这些元素之外,还可以使用其他元素,例如列表框、复选框、单选按钮等。您还可以向 GUI 提供菜单系统。某些专门的小部件(例如微调器、滑块等)也可以用于使设计更加有效。

窗口可以是非持久窗口,类似于弹出窗口。它会阻止程序流,直到用户通过单击客户端区域上的按钮或标题栏中的关闭 (X) 按钮将其关闭。

另一方面,持久窗口继续可见,直到发生导致其关闭的事件。异步窗口是一种内容定期更新的窗口。

布局结构

窗口客户区中元素或小部件的放置由列表对象列表控制。每个列表元素对应于窗口表面上的一行,并且可能包含 PySimpleGUI 库中可用的一个或多个 GUI 元素。

第一步是通过绘制如下图来可视化元素的放置 -

布局

窗口上的元素放置在四行中。前三行有一个 Text 元素(显示静态文本)和一个 InputText 元素(用户可以在其中输入)。最后一行有两个按钮,确定和取消。

这在列表列表中表示如下 -

import PySimpleGUI as psg
layout = [
   [psg.Text('Name '),psg.Input()],
   [psg.Text('Address '), psg.Input()],
   [psg.Text('Email ID '), psg.Input()],
   [psg.OK(), psg.Cancel()]
]

该列表对象用作 Window 类的构造函数的布局参数值。

window = psg.Window('Form', layout)

这将显示所需的窗口。用户输入存储在名为值的字典中。当用户按下“确定”按钮时,将调用 Window 类的 read() 方法,窗口立即关闭

渲染窗口的完整代码如下 -

import PySimpleGUI as psg
psg.set_options(font=('Arial Bold', 16))
layout = [
   [psg.Text('Name ', size=(15,1)),psg.Input(expand_x=True)],
   [psg.Text('Address ', size=(15,1)), psg.Input(expand_x=True)],
   [psg.Text('Email ID ', size=(15,1)), psg.Input(expand_x=True)],
   [psg.OK(), psg.Cancel()]
]
window = psg.Window('Form', layout, size=(715,207))
event, values = window.read()
print (event, values)
window.close()

这是显示的输出-

布局结构

输入如图所示的数据,然后按“确定”按钮。这些值将打印如下 -

OK {0: 'Kiran Gupta', 1: 'Mumbai', 2: 'kiran@gmail.com'}

如果填写数据后按“取消”按钮,打印的结果将是 -

Cancel {0: 'Kiran Gupta', 1: 'Mumbai', 2: 'kiran@gmail.com'}

持久窗口

请注意,一旦单击任何按钮(或标题栏中的“X”按钮),该窗口就会关闭。为了使窗口保持活动状态,直到按下称为 Exit 的特殊类型按钮,或者按“X”关闭窗口,read() 方法被置于无限循环中,并在 WIN_CLOSED 事件发生时(当 Exit 按钮时)中断。被按下)或退出事件发生(当按下“X”按钮时)。

让我们将上面代码中的“取消”按钮更改为“退出”按钮。

import PySimpleGUI as psg
layout = [
   [psg.Text('Name '), psg.Input()],
   [psg.Text('Address '), psg.Input()],
   [psg.Text('Email ID '), psg.Input()],
   [psg.OK(), psg.Exit()]
]
window = psg.Window('Form', layout)
while True:
   event, values = window.read()
   if event == psg.WIN_CLOSED or event == 'Exit':
      break
   print (event, values)
window.close()

窗口的外观将与以前类似,只是它不再是“取消”,而是具有“退出”按钮。

持久窗口

输入的数据将以元组的形式打印。第一个元素是事件,即按钮的标题,第二个元素是一个字典,其键是递增数字,值是输入的文本。

OK {0: 'kiran', 1: 'Mumbai', 2: 'kiran@gmail.com'}
OK {0: 'kirti', 1: 'Hyderabad', 2: 'kirti@gmail.com'}
OK {0: 'karim', 1: 'Chennai', 2: 'karim@gmail.com'}

窗口方法

Window 类中定义的重要方法是read()方法,用于收集所有输入元素中输入的值。Window 类还有其他方法来自定义外观和Behave。它们列在下面 -

先生。 方法及说明
1 添加行

将单行元素添加到窗口的“self.Rows”变量

2 添加行

循环遍历元素列表的列表,并将每一行、列表添加到布局中。

3 关闭

关闭窗口以便正确释放资源。

4 禁用

禁止窗口接受用户的任何输入

5 消失

导致窗口从屏幕上“消失”,但保留在任务栏上。

6 使能够

重新启用窗口以接受用户输入

7 充满

使用作为字典提供的数据填充作为输入字段的元素。

8 查找元素

查找与提供的键关联的元素对象。相当于“element = window[key]”

9 获取屏幕尺寸

获取屏幕尺寸。

10 隐藏

从屏幕和任务栏隐藏窗口

11 从磁盘加载

从“SaveToDisk”函数创建的 Pickle 文件中恢复值

12 布局

用小部件列表的列表填充窗口。

13

从您的窗口获取所有数据。传入等待超时(以毫秒为单位)。

14 再现

使消失的窗口再次显示。

15 保存到磁盘

将每个输入元素中包含的值保存到 pickle 文件中。

16 设置标题

更改任务栏中窗口的标题

使用密钥更新窗口

用户在窗口布局上的不同输入元素中输入的数据以字典格式存储。字典键按照从左到右、从上到下的顺序对应于输入元素进行编号(从0开始)。我们可以通过字典运算符来引用输入数据。这意味着第一个元素中的数据由“values[0]”返回。

values = {0: 'kiran', 1: 'Mumbai', 2: 'kiran@gmail.com'}
data = [values[k] for k in values.keys()]
print (data)

它将在控制台上打印以下内容 -

['kiran', 'Mumbai', 'kiran@gmail.com']

但是,如果要以编程方式操作元素的值,则必须通过为其键参数分配唯一的字符串值来初始化该元素。元素的键就像变量或标识符的名称,这使得以编程方式处理读取或为其赋值变得方便。

关键参数应该是一个字符串。约定是它应该是一个大写字符串,前面和后面都有一个“-”字符(示例:“- NAME-”)。但是,可以使用任何字符串。

让我们将键分配给上面示例中的输入元素,如下所示 -

layout = [
   [psg.Text('Name '),psg.Input(key='-NM-')],
   [psg.Text('Address '), psg.Input(key='-AD-')],
   [psg.Text('Email ID '), psg.Input(key='-ID-')],
   [psg.OK(), psg.Exit()],
]

因此,在read()方法之后返回的值字典将包含键标识符,而不是之前的整数。

OK {'-NM-': 'Kiran', '-AD-': 'Mumbai', '-ID-': 'kiran@gmail.com'}

现在,values[-NM-'] 将获取“Kiran”。该键可以分配给任何元素,而不仅仅是输入元素。您可以使用相同的键对元素调用 Update。我们可以使用Window对象的“find_element(key)”,或者使用window['key']来引用元素。

让我们扩展前面的示例,在“确定”和“取消”按钮之前添加一行,并使用“-OUT-”键添加一个空文本元素。在 OK 事件中,此文本标签显示在具有键“-NM-”、“-AD-”和“-ID-”的三个输入元素中输入的数据的串联

import PySimpleGUI as psg
psg.set_options(font=('Arial Bold', 16))
layout = [
   [psg.Text('Name ', size=(15, 1)),
   psg.Input(key='-NM-', expand_x=True)],
   [psg.Text('Address ', size=(15, 1)),
   psg.Input(key='-AD-', expand_x=True)],
   [psg.Text('Email ID ', size=(15, 1)),
   psg.Input(key='-ID-', expand_x=True)],
   [psg.Text('You Entered '), psg.Text(key='-OUT-')],
   [psg.OK(), psg.Exit()],
]
window = psg.Window('Form', layout, size=(715, 200))
while True:
   event, values = window.read()
   print(event, values)
   out = values['-NM-'] + ' ' + values['-AD-'] + ' ' + values['-ID-']
   window['-OUT-'].update(out)
   if event == psg.WIN_CLOSED or event == 'Exit':
      break
window.close()

运行上面的代码,在三个输入元素中输入文本,然后按“确定”。-OUT- 文本标签将更新,如下所示 -

更新窗口

下面给出了使用 key 属性的另一个示例。输入元素被分配关键参数 -FIRST- 和 -SECOND-。有两个标题为“添加”和“子”的按钮。文本元素根据按下的按钮显示两个数字的加法或减法。

import PySimpleGUI as psg
import PySimpleGUI as psg
psg.set_options(font=('Arial Bold', 16))
layout = [
   [psg.Text('Enter a num: '), psg.Input(key='-FIRST-')],
   [psg.Text('Enter a num: '), psg.Input(key='-SECOND-')],
   [psg.Text('Result : '), psg.Text(key='-OUT-')],
   [psg.Button("Add"), psg.Button("Sub"), psg.Exit()],
]
window = psg.Window('Calculator', layout, size=(715, 180))
while True:
   event, values = window.read()
   print(event, values)
   if event == "Add":
      result = int(values['-FIRST-']) + int(values['-SECOND-'])
   if event == "Sub":
      result = int(values['-FIRST-']) - int(values['-SECOND-'])
   window['-OUT-'].update(result)
   if event == psg.WIN_CLOSED or event == 'Exit':
      break
window.close()

以下屏幕截图显示了按下“添加”按钮时的结果。

更新窗口

无边框窗

默认情况下,应用程序窗口在客户区域上方创建一个标题栏,其中所有其他元素都放置在布局中。标题栏由左侧的窗口标题和右侧的控制按钮(最小化、恢复/最大化和关闭)组成。然而,特别是对于类似信息亭的应用程序,不需要标题栏。您可以通过将 Window 对象的“no_titlebar”属性设置为“True”来删除标题栏。

边框窗口

要终止此类应用程序,必须在发生“退出”按钮事件时终止事件循环。

禁用关闭的窗口

如果您希望阻止用户最小化应用程序窗口,则应将 Window 对象的“disable_minimize”属性设置为 True。同样,“disable_close”属性的 True 值会显示关闭按钮,但不会创建 WINDOW_CLOSED 事件。

边框已禁用

透明窗

Window对象的“alpha_channel”属性决定了窗口的透明度。它的值在 0 到 1 之间。默认情况下,它是 0,这意味着窗口显示为不透明。将其设置为 1 使其完全透明。0 到 1 之间的任何浮点值都会使透明度成比例。

透明窗

多个窗口

PySimpleGUI 允许同时显示多个窗口。PySimpleGUI 模块中的静态函数在调用时读取所有活动窗口。要使窗口处于活动状态,必须对其进行最终确定。该函数返回一个(窗口、事件、值)结构的元组。

window, event, values = PySimpleGUI.read_all_windows()

如果没有窗口打开,则其返回值为(None, WIN_CLOSED, None)

在下面的代码中,两个函数“win1()”和“win2()”在调用时分别创建一个窗口。从第一个窗口开始,标题为“Window-2”的按钮会打开另一个窗口,因此两个窗口都处于活动状态。当第一个窗口发生 CLOSED 事件时,两个窗口都关闭并且程序结束。如果按下第二个窗口上的“X”按钮,它将被标记为关闭,而第一个窗口保持打开状态。

import PySimpleGUI as psg
def win1():
   layout = [
      [psg.Text('This is the FIRST WINDOW'), psg.Text('', key='-OUTPUT-')],
      [psg.Text('popup one')],
      [psg.Button('Window-2'), psg.Button('Popup'), psg.Button('Exit')]
   ]
   return psg.Window('Window Title', layout, finalize=True)
   def win2():
      layout = [
         [psg.Text('The second window')],
         [psg.Input(key='-IN-', enable_events=True)],
         [psg.Text(size=(25, 1), key='-OUTPUT-')],
         [psg.Button('Erase'), psg.popup('Popup two'), psg.Button('Exit')]]
         return psg.Window('Second Window', layout, finalize=True)
window1 = win1()
window2 = None
while True:
   window, event, values = psg.read_all_windows()
   print(window.Title, event, values)
   if event == psg.WIN_CLOSED or event == 'Exit':
      window.close()
   if window == window2:
      window2 = None
   elif window == window1:
      break
   elif event == 'Popup':
      psg.popup('Hello Popup')
   elif event == 'Window-2' and not window2:
      window2 = win2()
   elif event == '-IN-':
      window['-OUTPUT-'].update('You entered {}'.format(values["-IN-"]))
   elif event == 'Erase':
      window['-OUTPUT-'].update('')
      window['-IN-'].update('')
window.close()

它将产生以下输出窗口:

多个窗口

异步窗口

Window 类的read ()方法具有以下附加参数 -

window.read(timeout = t, timeout_key=TIMEOUT_KEY, close=False)

超时参数允许您的 GUI 在非阻塞读取情况下使用这是您的设备在返回之前可以等待的毫秒数。它创建一个定期运行的窗口。

添加超时值的时间越长,占用的 CPU 时间就越少。在超时时间内,您将“让出”处理器来执行其他任务。与使用非阻塞读取相比,您的 GUI 的响应速度会更快。

timeout_key 参数有助于判断在规定时间内是否有任何用户操作。“timeout_key”的默认值为“__timeout__”。

while True:
   event, value = window.read(timeout=10)
   if event == sg.WIN_CLOSED:
      break
   if event == sg.TIMEOUT_KEY:
      print("Nothing happened")

要使窗口可移动,请将 Window 对象的“grab_anywhere”属性设置为 true。如果“keep_on_top”属性设置为True,则窗口将保持在当前窗口之上。