• PySimpleGUI:使用 Python 轻松制作一个图形界面(GUI)


    大家好,GUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。

    一个好看又好用的GUI,可以大大提高大家的使用体验,提高效率。比如你想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没有用户体验的。所以开发一个图形化的小窗口,就变得很有必要。

    今天,我就给大家介绍如何只用一行Python代码制作一个GUI,主要使用Python的PySimpleGUI库来完成这个工作。喜欢记得收藏、关注、点赞。

    注:完整版代码、资料、技术交流文末获取。

    # 安装PySimpleGUI
    pip install PySimpleGUI -i https://mirror.baidu.com/pypi/simple
    
    • 1
    • 2

    详细的接口文档地址如下。

    https://pysimplegui.readthedocs.io/en/latest/call%20reference/

    ▍1、选择文件夹

    首先导入PySimpleGUI库,并且用缩写sg来表示。

    import PySimpleGUI as sg
    
    # 窗口显示文本框和浏览按钮, 以便选择一个文件夹
    dir_path = sg.popup_get_folder("Select Folder")
    if not dir_path:
        sg.popup("Cancel", "No folder selected")
        raise SystemExit("Cancelling: no folder selected")
    else:
        sg.popup("The folder you chose was", dir_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过使用PySimpleGUI的popup_get_folder()方法,一行代码就能实现选择文件夹的操作。

    示例如下。

    图片

    点击Browse按钮,选择文件夹,文本框就会显示出文件夹的绝对路径。

    点击OK按钮,显示最终选择的路径信息,再次点击OK按钮,结束窗口。

    图片

    如果没有选择文件夹,而是直接点击OK按钮,会直接提示没有选取文件夹。

    ▍2、选择文件

    选择文件操作和上面选择文件夹的有点相似。

    不同的是,选择文件可以设置multiple_files(是否为多个文件)和file_types(文件类型)参数。

    # 窗口显示文本框和浏览按钮, 以便选择文件
    fname = sg.popup_get_file("Choose Excel file", multiple_files=True, file_types=(("Excel Files", "*.xls*"),),)
    if not fname:
        sg.popup("Cancel", "No filename supplied")
        raise SystemExit("Cancelling: no filename supplied")
    else:
        sg.popup("The filename you chose was", fname)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例如下。

    图片

    选择了多个Excel文件,最终结果返回了所有文件的路径地址。

    ▍3、选择日期

    使用popup_get_date()方法,显示一个日历窗口。

    # 显示一个日历窗口, 通过用户的选择, 返回一个元组(月, 日, 年)
    date = sg.popup_get_date()
    if not date:
        sg.popup("Cancel", "No date picked")
        raise SystemExit("Cancelling: no date picked")
    else:
        sg.popup("The date you chose was", date)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例如下。

    图片

    选择好日期后,点击OK按钮,即可返回日期元组结果。

    ▍4、输入文本

    使用popup_get_text()方法,显示一个文本输入框。

    # 显示文本输入框, 输入文本信息, 返回输入的文本, 如果取消则返回None
    text = sg.popup_get_text("Please enter a text:")
    if not text:
        sg.popup("Cancel", "No text was entered")
        raise SystemExit("Cancelling: no text entered")
    else:
        sg.popup("You have entered", text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    键入信息,示例如下。

    图片

    点击OK按钮,返回输入的文本信息。

    如果没有输入,直接点击OK按钮,会提示没有文本输入。

    ▍5、弹窗无按钮

    # 显示一个弹窗, 但没有任何按钮
    sg.popup_no_buttons("You cannot click any buttons")
    
    • 1
    • 2

    结果如下。

    图片

    ▍6、弹窗无标题

    # 显示一个没有标题栏的弹窗
    sg.popup_no_titlebar("A very simple popup")
    
    • 1
    • 2

    结果如下。

    图片

    ▍7、弹窗只有OK按钮

    # 显示弹窗且只有OK按钮
    sg.popup_ok("You can only click on 'OK'")
    
    • 1
    • 2

    结果如下。

    图片

    ▍8、弹窗只有Error按钮(红色)

    # 显示弹窗且只有error按钮, 按钮带颜色
    sg.popup_error("Something went wrong")
    
    • 1
    • 2

    结果如下。

    图片

    ▍9、显示通知窗口

    # 显示一个“通知窗口”, 通常在屏幕的右下角, 窗口会慢慢淡入淡出
    sg.popup_notify("Task done!")
    
    • 1
    • 2

    结果如下, Task done提示信息淡入淡出。

    图片

    ▍10、弹窗选择

    # 显示弹窗以及是和否按钮, 选择判断
    answer = sg.popup_yes_no("Do you like this video?")sg.popup("You have selected", answer)
    
    • 1
    • 2

    结果如下。

    图片

    ▍11、自定义弹窗

    上面那些弹窗都是库自带的,如果想自定义创建,可以参考下面的方法。

    # 自定义创建弹窗, 一行代码完成
    choice, _ = sg.Window(
        "Continue?",
        [[sg.T("Do you want to subscribe to this channel?")], [sg.Yes(s=10), sg.No(s=10), sg.Button('Maybe', s=10)]],
        disable_close=True,
    ).read(close=True)
    sg.popup("Your choice was", choice)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结果如下。

    图片

    ▍12、实战

    最后来个综合实战案例,将某个文件夹下所有的Excel文件中的sheet表,一一保存为单独的Excel文件

    代码如下,需要安装xlwings库,其中pathlib库是内置的。

    from pathlib import Path
    import PySimpleGUI as sg
    import xlwings as xw
    
    # 选择输入文件夹
    INPUT_DIR = sg.popup_get_folder("Select an input folder")
    if not INPUT_DIR:
        sg.popup("Cancel", "No folder selected")
        raise SystemExit("Cancelling: no folder selected")
    else:
        INPUT_DIR = Path(INPUT_DIR)
    
    # 选择输出文件夹
    OUTPUT_DIR = sg.popup_get_folder("Select an output folder")
    if not OUTPUT_DIR:
        sg.popup("Cancel", "No folder selected")
        raise SystemExit("Cancelling: no folder selected")
    else:
        OUTPUT_DIR = Path(OUTPUT_DIR)
    
    # 获取输入文件夹中所有xls格式文件的路径列表
    files = list(INPUT_DIR.rglob("*.xls*"))
    
    with xw.App(visible=False) as app:
        for index, file in enumerate(files):
            # 显示进度
            sg.one_line_progress_meter("Current Progress", index + 1, len(files))
            wb = app.books.open(file)
            # 提取sheet表为单独的Excel表格
            for sheet in wb.sheets:
                wb_new = app.books.add()
                sheet.copy(after=wb_new.sheets[0])
                wb_new.sheets[0].delete()
                wb_new.save(OUTPUT_DIR / f"{file.stem}_{sheet.name}.xlsx")
                wb_new.close()
    
    sg.popup_ok("Task done!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    首先选择输入文件夹和输出文件夹的地址。

    然后通过pathlib库对输入文件夹进行遍历,查找出所有xls格式文件的路径地址。

    图片

    点击OK按钮后,就会开始表格转换,操作如下。

    图片

    使用了one_line_progress_meter()方法显示程序处理的进度。

    图片

    20表示有20次循环,原始Excel文件总计有20个,需要处理20次,其他的都在上图中标示出来咯。

    好了,今天的分享就到这里了,有兴趣的小伙伴可以自行去学习。

    别忘了点赞在看哈~

    推荐文章

    技术交流

    完整代码、数据获取,可以找我来要

    目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

    • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
    • 方式②、添加微信号:dkl88191,备注:来自CSDN
    • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
      在这里插入图片描述

    技术交流、求职内推、干货汇总、与 3000+来自阿里、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

  • 相关阅读:
    EventListener
    CentOS 7操作系统磁盘配额:
    微信native-v3版支付对接流程及demo
    /usr/bin/c++ not found 处理
    [附源码]java毕业设计昆明市人民医院血库管理系统
    飞塔防火墙HA详解与配置
    Coursera耶鲁大学金融课程:Financial Markets 笔记Week 02
    【第62篇】DepGraph:适用任何结构的剪枝
    x86 架构的机载计算机,它来了!
    消息订阅与发布
  • 原文地址:https://blog.csdn.net/qq_34160248/article/details/124898496