Mike Driscoll:PySimpleGUI - 铺设元素的介绍
PySimpleGUI是一个Python GUI,它封装了其他的Python GUI工具箱(Tkinter, PySide, wxPython)。通过将其他GUI的复杂性抽象成一个通用的API,你可以快速地编写代码,只需在你的程序顶部改变导入,就可以使用任何其他工具包进行渲染。
如果你要使用wxPython,并且你想布局你的小部件,你会使用wx.Sizer。在PySide或PyQt中,你会使用Layout对象。Tkinter使用几何管理器。一般的概念都是一样的。当你使用这些工具时,GUI工具包使用小部件的相对定位来安排它们在屏幕上。
在PySimpleGUI中,同样的事情是使用嵌套列表来完成的。在本教程中,你将会看到几个不同的例子,这些例子会让你对这一切如何运作有一个大致的了解。
创建一个水平布局
创建一系列水平方向(从左到右)的元素是通过 PySimpleGUI 中的一个小列表完成的。
打开一个Python编辑器,添加以下代码。
import PySimpleGUI as sg
# Horizontal layout
layout = [[sg.Button(f"OK {num}") for num in range(1, 6)]]
# Create the window
window = sg.Window("Demo", layout)
# Create an event loop
while True:
event, values = window.read()
# End program if user closes window or
# presses the OK button
if event == "OK" or event == sg.WIN_CLOSED:
break
window.close()
这里你用Python的列表理解来创建一个嵌套的列表,其中包含五个Button对象。当你运行这段代码时,你会看到按钮是水平排列的,一个挨着一个,从左到右。
现在你已经准备好了,看看如何重写代码来创建一个垂直的布局
创建一个垂直的布局
为了用 PySimpleGUI 创建一个垂直方向的布局,你需要使布局包含一系列的嵌套列表,每个列表中都包含一个或多个元素。
创建一个新的 Python 文件,并在其中添加这段代码。
import PySimpleGUI as sg
layout = [[sg.Button("OK")],
[sg.Button("OK 2")],
[sg.Button("OK 3")],
[sg.Button("OK 4")],
[sg.Button("OK 5")]]
# Create the window
window = sg.Window("Demo", layout)
# Create an event loop
while True:
event, values = window.read()
# End program if user closes window or
# presses the OK button
if event == "OK" or event == sg.WIN_CLOSED:
break
window.close()
当你运行这段代码时,Button Elements将从上到下垂直堆叠,而不是水平堆叠。
为复杂的布局使用列
如果你需要在PySimpleGUI中添加两列或多列相邻的元素,你可以使用sg.Column元素。它是一种容器元素的类型,专门为创建堆叠的元素集而制造的
创建另一个Python文件并添加以下代码。
import PySimpleGUI as sg
import os.path
# First the window layout in 2 columns
file_list_column = [
[sg.Text("Image Folder"),
sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
sg.FolderBrowse(),],
[sg.Listbox(values=[], enable_events=True, size=(40, 20), key="-FILE LIST-")],
]
# For now will only show the name of the file that was chosen
image_viewer_column = [
[sg.Text("Choose an image from list on left:")],
[sg.Text(size=(40, 1), key="-TEXT-")],
[sg.Image(key="-IMAGE-")],
]
# ----- Full layout -----
layout = [
[sg.Column(file_list_column),
sg.VSeperator(),
sg.Column(image_viewer_column),]
]
window = sg.Window("Column Demo", layout)
# Run the Event Loop
while True:
event, values = window.read()
if event == "Exit" or event == sg.WIN_CLOSED:
break
# Folder name was filled in, make a list of files in the folder
if event == "-FOLDER-":
folder = values["-FOLDER-"]
try:
# Get list of files in folder
file_list = os.listdir(folder)
except:
file_list = []
fnames = [
f
for f in file_list
if os.path.isfile(os.path.join(folder, f))
and f.lower().endswith((".png", ".gif"))
]
window["-FILE LIST-"].update(fnames)
elif event == "-FILE LIST-": # A file was chosen from the listbox
try:
filename = os.path.join(values["-FOLDER-"], values["-FILE LIST-"][0])
window["-TEXT-"].update(filename)
window["-IMAGE-"].update(filename=filename)
except:
pass
window.close()
在这个例子中,你创建了两个布局!第一个布局被称为file_list_column ,其中包含四个元素。第二个布局被称为image_viewer_column ,包含三个元素。然后你把这些布局放在列里面,而这些列本身又在一个布局里面。正如你所看到的,PySimpleGUI的布局是列表中的列表,一直以来都是如此。
总结
PySimpleGUI通过使用Python列表消除了创建布局的一些复杂性。PyQt / PySide 和 wxPython GUI 工具包使用面向对象的方法,包括大量的模板和标志来做同样的事情。他们都有自己的权衡,但由于他们的设计选择,PySimpleGUI的学习曲线要平缓得多。
相关阅读
The postPySimpleGUI - An Intro to Laying Out Elementsappeared first onMouse Vs Python.
转载自:https://juejin.cn/post/7057345725323018277