likes
comments
collection
share

Mike Driscoll:PySimpleGUI - 铺设元素的介绍

作者站长头像
站长
· 阅读数 40

PySimpleGUI是一个Python GUI,它封装了其他的Python GUI工具箱(Tkinter, PySide, wxPython)。通过将其他GUI的复杂性抽象成一个通用的API,你可以快速地编写代码,只需在你的程序顶部改变导入,就可以使用任何其他工具包进行渲染。

如果你要使用wxPython,并且你想布局你的小部件,你会使用wx.Sizer。在PySide或PyQt中,你会使用Layout对象。Tkinter使用几何管理器。一般的概念都是一样的。当你使用这些工具时,GUI工具包使用小部件的相对定位来安排它们在屏幕上。

在PySimpleGUI中,同样的事情是使用嵌套列表来完成的。在本教程中,你将会看到几个不同的例子,这些例子会让你对这一切如何运作有一个大致的了解。

创建一个水平布局

创建一系列水平方向(从左到右)的元素是通过 PySimpleGUI 中的一个小列表完成的。

Mike Driscoll: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 创建一个垂直方向的布局,你需要使布局包含一系列的嵌套列表,每个列表中都包含一个或多个元素。

Mike Driscoll: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元素。它是一种容器元素的类型,专门为创建堆叠的元素集而制造的

Mike Driscoll:PySimpleGUI - 铺设元素的介绍

创建另一个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
评论
请登录