探索PySimpleGUI:一款简洁易用的图形用户界面库

目录

PySimpleGUI

安装使用

代码框架

常用控件

Text

Input

Button

布局方法

事件循环

示例代码

调试窗口

主题 theme

Listbox控件

简单实例

小结


PySimpleGUI

PySimpleGUI是一个基于Tkinter、WxPython、Qt等底层库构建的图形界面框架,其设计目标是使Python GUI编程变得更加简单直观,大大降低了入门门槛。无论是初学者还是经验丰富的开发者,都可以快速上手并高效地创建出功能丰富、外观现代的桌面应用程序。

PySimpleGUI的核心优势在于其高度抽象化的API设计,它提供了包括按钮、输入框、列表框、滑块等各种常见的GUI元素。除了基本的布局和样式设置,PySimpleGUI还支持事件驱动的编程模型。你可以为元素添加事件处理程序,以便响应用户与窗口的交互,如点击按钮、选择菜单项等。事件处理程序可以根据需要执行各种操作,如更新元素的值、触发其他事件或执行自定义代码。

此外,PySimpleGUI还提供了许多有用的功能和工具,如表单验证、动画和动画效果、工具提示等,这些功能可以帮助你构建更丰富和交互式的GUI应用程序;其次,PySimpleGUI还支持自定义主题,满足不同场景下的UI风格需求;同时,它也具备良好的跨平台兼容性,能够在Windows、Mac和Linux系统下稳定运行。

安装使用

PySimpleGUI 当前版本为 4.60.5,安装命令如下:

C:\> pip install PySimpleGUI

如果你还在用python2.7,那么需要安装对应的库PySimpleGUI27:

C:\> pip install PySimpleGUI27

使用时,一般都PySimpleGUI把导入成别名sg:

import PySimpleGUI as sg

代码框架

如创建上面这样一个简单的windows窗口,共布局两个文本框(标签)、一个输入框和两个按钮,其代码的框架分5个部分:

导入库包、控件布局、创建窗口、事件循环、退出窗口

完整代码如下:

import PySimpleGUI as sg  #导入库包# 定义布局
layout = [[sg.Text("请输入你的名字:")],[sg.Input(key="-NAME-", enable_events=True)],[sg.Button("确定"), sg.Button("退出")],[sg.Text(size=(40, 1), key="-OUTPUT-")]
]# 创建窗口
window = sg.Window("程序标题", layout)# 事件循环
while True:  event, values = window.read()if event == "退出" or event == sg.WIN_CLOSED:  break  elif event == "确定":  name = values["-NAME-"]  window["-OUTPUT-"].update(f"你好,{name}!")  #退出窗口
window.close()

导入、创建、退出三步都是固定的,主要学习控件布局和事件循环。

常用控件

Text、Input、Button是三种最常见的控件:

Text

是一个用于显示静态文本的控件,在图形用户界面中对用户是不可编辑的信息展示区域。

Text(text='', size=(None, None), s=(None, None), auto_size_text=None, click_submits=False, enable_events=False, relief=None, font=None, text_color=None, background_color=None, border_width=None, justification=None, pad=None, p=None, key=None, k=None, right_click_menu=None, expand_x=False, expand_y=False, grab=None, tooltip=None, visible=True, metadata=None)

主要参数说明:

  • key(str):控件的唯一标识符,用于识别和处理事件。
  • size(tuple):指定控件的大小,格式为 (宽度, 高度)。默认值为 (None, None),表示自动调整大小以适应内容。
  • text(str):要在控件中显示的初始文本内容。默认值为空字符串。
  • disabled(bool):指定控件是否禁用。默认值为 False,表示启用控件。
  • enable_events(bool):指定是否启用控件的事件处理功能。默认值为 True,表示启用事件处理。
  • font(Font):指定控件的字体样式。默认值为 None,表示使用系统默认字体。
  • justification(str):指定文本对齐方式。可选值包括 "left"、"right"、"center" 和 "justify"。默认值为 "left"。
  • expand(bool):指定是否扩展控件以填充其父容器的剩余空间。默认值为 False。
  • pad(int or tuple):指定控件周围的内边距大小。可以是单个整数或包含四个整数的元组,分别代表上、下、左、右边距。默认值为 (0, 0, 0, 0)。
  • background_color(Color):指定控件的背景颜色。默认值为 None,表示使用父容器的背景颜色。
  • border_width(int or tuple):指定控件边框的宽度。可以是单个整数或包含四个整数的元组,分别代表上、下、左、右边框的宽度。默认值为 (2, 2, 2, 2)。
  • border_color(Color):指定控件边框的颜色。默认值为 None,表示使用父容器的边框颜色。
  • readonly(bool):指定控件是否只读。默认值为 False,表示允许编辑文本内容。
  • return_keyboard_events(bool):指定是否返回键盘事件给父窗口。默认值为 True,表示返回键盘事件给父窗口。
  • visible(bool):指定控件是否可见。默认值为 True,表示显示控件。
  • tooltip(str):指定当鼠标悬停在控件上时显示的工具提示文本。默认值为 None,表示不显示工具提示文本。
  • metadata(dict):附加的元数据信息,可以用于自定义属性或行为。默认值为 {},表示没有附加的元数据信息。

Input

也可以写成sg.InputText,Input和InputText是同一个控件。用于在窗口中获取用户输入的文本,也可以接受一个字符串参数作为要显示的初始文本内容。

Input(default_text='', size=(None, None), s=(None, None), disabled=False, password_char='', justification=None, background_color=None, text_color=None, font=None, tooltip=None, border_width=None, change_submits=False, enable_events=False, do_not_clear=True, key=None, k=None, focus=False, pad=None, p=None, use_readonly_for_disable=True, readonly=False, disabled_readonly_background_color=None, disabled_readonly_text_color=None, expand_x=False, expand_y=False, right_click_menu=None, visible=True, metadata=None)

主要参数说明:

  • key(str):控件的唯一标识符,用于识别和处理事件。
  • size(tuple):指定控件的大小,格式为 (宽度, 高度)。默认值为 (None, None),表示自动调整大小以适应内容。
  • default_text(str):要在控件中显示的初始文本内容。默认值为空字符串。
  • disabled(bool):指定控件是否禁用。默认值为 False,表示启用控件。
  • enable_events(bool):指定是否启用控件的事件处理功能。默认值为 True,表示启用事件处理。
  • font(Font):指定控件的字体样式。默认值为 None,表示使用系统默认字体。
  • justification(str):指定文本对齐方式。可选值包括 "left"、"right"、"center" 和 "justify"。默认值为 "left"。
  • expand(bool):指定是否扩展控件以填充其父容器的剩余空间。默认值为 False。
  • pad(int or tuple):指定控件周围的内边距大小。可以是单个整数或包含四个整数的元组,分别代表上、下、左、右边距。默认值为 (0, 0, 0, 0)。
  • background_color(Color):指定控件的背景颜色。默认值为 None,表示使用父容器的背景颜色。
  • border_width(int or tuple):指定控件边框的宽度。可以是单个整数或包含四个整数的元组,分别代表上、下、左、右边框的宽度。默认值为 (2, 2, 2, 2)。
  • border_color(Color):指定控件边框的颜色。默认值为 None,表示使用父容器的边框颜色。
  • readonly(bool):指定控件是否只读。默认值为 False,表示允许编辑文本内容。
  • return_keyboard_events(bool):指定是否返回键盘事件给父窗口。默认值为 True,表示返回键盘事件给父窗口。
  • visible(bool):指定控件是否可见。默认值为 True,表示显示控件。
  • tooltip(str):指定当鼠标悬停在控件上时显示的工具提示文本。默认值为 None,表示不显示工具提示文本。
  • metadata(dict):附加的元数据信息,可以用于自定义属性或行为。默认值为 {},表示没有附加的元数据信息。

Button

也可以写成sg.InputText,Input和InputText是同一个控件。用于在窗口中获取用户输入的文本,也可以接受一个字符串参数作为要显示的初始文本内容。

Button(button_text='', button_type=7, target=(None, None), tooltip=None, file_types=(('ALL Files', '*.* *'),), initial_folder=None, default_extension='', disabled=False, change_submits=False, enable_events=False, image_filename=None, image_data=None, image_size=(None, None), image_subsample=None, image_source=None, border_width=None, size=(None, None), s=(None, None), auto_size_button=None, button_color=None, disabled_button_color=None, highlight_colors=None, mouseover_colors=(None, None), use_ttk_buttons=None, font=None, bind_return_key=False, focus=False, pad=None, p=None, key=None, k=None, right_click_menu=None, expand_x=False, expand_y=False, visible=True, metadata=None)

主要参数说明:

  • key(str):控件的唯一标识符,用于识别和处理事件。
  • size(tuple):指定控件的大小,格式为 (宽度, 高度)。默认值为 (None, None),表示自动调整大小以适应内容。
  • text(str):要在控件上显示的文本内容。默认值为空字符串。
  • disabled(bool):指定控件是否禁用。默认值为 False,表示启用控件。
  • enable_events(bool):指定是否启用控件的事件处理功能。默认值为 True,表示启用事件处理。
  • font(Font):指定控件的字体样式。默认值为 None,表示使用系统默认字体。
  • justification(str):指定文本对齐方式。可选值包括 "left"、"right"、"center" 和 "justify"。默认值为 "left"。
  • expand(bool):指定是否扩展控件以填充其父容器的剩余空间。默认值为 False。
  • pad(int or tuple):指定控件周围的内边距大小。可以是单个整数或包含四个整数的元组,分别代表上、下、左、右边距。默认值为 (0, 0, 0, 0)。
  • background_color(Color):指定控件的背景颜色。默认值为 None,表示使用父容器的背景颜色。
  • border_width(int or tuple):指定控件边框的宽度。可以是单个整数或包含四个整数的元组,分别代表上、下、左、右边框的宽度。默认值为 (2, 2, 2, 2)。
  • border_color(Color):指定控件边框的颜色。默认值为 None,表示使用父容器的边框颜色。
  • readonly(bool):指定控件是否只读。默认值为 False,表示允许编辑文本内容。
  • return_keyboard_events(bool):指定是否返回键盘事件给父窗口。默认值为 True,表示返回键盘事件给父窗口。
  • visible(bool):指定控件是否可见。默认值为 True,表示显示控件。
  • tooltip(str):指定当鼠标悬停在控件上时显示的工具提示文本。默认值为 None,表示不显示工具提示文本。
  • metadata(dict):附加的元数据信息,可以用于自定义属性或行为。默认值为 {},表示没有附加的元数据信息。

布局方法

用一个二维列表(layout)作为 sg.Windows() 的一个参数来创建。

layout = [  [sg.Text('Some text on Row 1')],
            [sg.Text('Enter something on Row 2'), sg.InputText()],
            [sg.Button('Ok'), sg.Button('Cancel')] ]

window = sg.Window('Window Title', layout)

二维列表中还可以用推导式来表达多个控件,比如连续5个按钮:

layout = [[sg.Button(f'按钮{i+1}') for i in range(6)]]

事件循环

标准格式:

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == '退出':
        break
    elif event.startswith('按钮'):
        print(f'你点击了{event}')

退出事件 sg.WIN_CLOSED 即点了窗口右上角的X关闭钮,event == '退出' 表示点退出按钮。

也可以写成:

if event in (sg.WIN_CLOSED, '退出'): 

    break

示例代码

import PySimpleGUI as sglayout = [[sg.Button(f'按钮{i+1}') for i in range(6)]+[sg.Button('退出')]]window = sg.Window('示例窗口', layout)while True:event, values = window.read()if event == sg.WIN_CLOSED or event == '退出':breakelif event.startswith('按钮'):print(f'你点击了{event}')window.close()


调试窗口

使用sg.Print()比内置的print()更直观,它会弹出一个调试窗口:

程序会结束前点Quit退出会重新打开一个窗口;而Pause会和Resum来回切换。文本还能设置前景和背景色,参数分别为:text_color='',background_color=''。

import PySimpleGUI as sgsg.Print('This text is white on a green background', text_color='white', background_color='green', font='Courier 10')
sg.Print('The first call sets some window settings like font that cannot be changed')
sg.Print('This is plain text just like a print would display')
sg.Print('White on Red', background_color='red', text_color='white')
sg.Print('The other print', 'parms work', 'such as sep', sep=',')
sg.Print('To not extend a colored line use the "end" parm', background_color='blue', text_color='white', end='')
sg.Print('\nThis line has no color.')


主题 theme

注意到没上面几个例程的主体和控件的背景色都是灰青色系的,这是因为它们都用了同一个默认主题theme。要使用其它色彩的主题,需要设置theme的方法: sg.theme("主题名称")

当前版本的PySimpleGUI共内置了154个主题:

>>> sg.theme_list()                                                                                                         
['Black', 'BlueMono', 'BluePurple', 'BrightColors', 'BrownBlue', 'Dark', 'Dark2', 'DarkAmber', 'DarkBlack', 'DarkBlack1', 'DarkBlue', 'DarkBlue1', 'DarkBlue10', 'DarkBlue11', 'DarkBlue12', 'DarkBlue13', 'DarkBlue14', 'DarkBlue15', 'DarkBlue16', 'DarkBlue17', 'DarkBlue2', 'DarkBlue3', 'DarkBlue4', 'DarkBlue5', 'DarkBlue6', 'DarkBlue7', 'DarkBlue8', 'DarkBlue9', 'DarkBrown', 'DarkBrown1', 'DarkBrown2', 'DarkBrown3', 'DarkBrown4', 'DarkBrown5', 'DarkBrown6', 'DarkBrown7', 'DarkGreen', 'DarkGreen1', 'DarkGreen2', 'DarkGreen3', 'DarkGreen4', 'DarkGreen5', 'DarkGreen6', 'DarkGreen7', 'DarkGrey', 'DarkGrey1', 'DarkGrey10', 'DarkGrey11', 'DarkGrey12', 'DarkGrey13', 'DarkGrey14', 'DarkGrey15', 'DarkGrey2', 'DarkGrey3', 'DarkGrey4', 'DarkGrey5', 'DarkGrey6', 'DarkGrey7', 'DarkGrey8', 'DarkGrey9', 'DarkPurple', 'DarkPurple1', 'DarkPurple2', 'DarkPurple3', 'DarkPurple4', 'DarkPurple5', 'DarkPurple6', 'DarkPurple7', 'DarkRed', 'DarkRed1', 'DarkRed2', 'DarkTanBlue', 'DarkTeal', 'DarkTeal1', 'DarkTeal10', 'DarkTeal11', 'DarkTeal12', 'DarkTeal2', 'DarkTeal3', 'DarkTeal4', 'DarkTeal5', 'DarkTeal6', 'DarkTeal7', 'DarkTeal8', 'DarkTeal9', 'Default', 'Default1', 'DefaultNoMoreNagging', 'GrayGrayGray', 'Green', 'GreenMono', 'GreenTan', 'HotDogStand', 'Kayak', 'LightBlue', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4', 'LightBlue5', 'LightBlue6', 'LightBlue7', 'LightBrown', 'LightBrown1', 'LightBrown10', 'LightBrown11', 'LightBrown12', 'LightBrown13', 'LightBrown2', 'LightBrown3', 'LightBrown4', 'LightBrown5', 'LightBrown6', 'LightBrown7', 'LightBrown8', 'LightBrown9', 'LightGray1', 'LightGreen', 'LightGreen1', 'LightGreen10', 'LightGreen2', 'LightGreen3', 'LightGreen4', 'LightGreen5', 'LightGreen6', 'LightGreen7', 'LightGreen8', 'LightGreen9', 'LightGrey', 'LightGrey1', 'LightGrey2', 'LightGrey3', 'LightGrey4', 'LightGrey5', 'LightGrey6', 'LightPurple', 'LightTeal', 'LightYellow', 'Material1', 'Material2', 'NeutralBlue', 'Purple', 'Python', 'PythonPlus', 'Reddit', 'Reds', 'SandyBeach', 'SystemDefault', 'SystemDefault1', 'SystemDefaultForReal', 'Tan', 'TanBlue', 'TealMono', 'Topanga']
>>> len(sg.theme_list()) 
154
>>> sg.theme_previewer()  #此函数会弹出所有主题列表

主题列表: 

与操作系统比较一致的主题样式是SystemDefaultForReal,设置使用sg.theme()。

下面是一个展示主题列表的例程:sg.theme('SystemDefaultForReal')

import PySimpleGUI as sgsg.theme('SystemDefaultForReal')layout = [[sg.Text('Theme Browser')],[sg.Text('Click a Theme color to see demo window')],[sg.Listbox(values=sg.theme_list(), size=(20, 12), key='-LIST-', enable_events=True)],[sg.Button('Exit')]]window = sg.Window('Theme Browser', layout)while True:  # Event Loopevent, values = window.read()if event in (sg.WIN_CLOSED, 'Exit'):breaksg.theme(values['-LIST-'][0])sg.popup_get_text('This is {}'.format(values['-LIST-'][0]))window.close()

SystemDefaultForReal主题基本与操作系统的一致,也可以写作Default1或SystemDefault1。 

Listbox控件

Listbox 控件是一个多选列表框,用于显示和选择多个项目。 

Listbox(values, default_values=None, select_mode=None, change_submits=False, enable_events=False, bind_return_key=False, size=(None, None), s=(None, None), disabled=False, auto_size_text=None, font=None, no_scrollbar=False, horizontal_scroll=False, background_color=None, text_color=None, highlight_background_color=None, highlight_text_color=None, sbar_trough_color=None, sbar_background_color=None, sbar_arrow_color=None, sbar_width=None, sbar_arrow_width=None, sbar_frame_color=None, sbar_relief=None, key=None, k=None, pad=None, p=None, tooltip=None, expand_x=False, expand_y=False, right_click_menu=None, visible=True, metadata=None)

主要参数说明:
param values:                     list of values to display. Can be any type including mixed types as long as they have __str__ method
:type values:                      List[Any] or Tuple[Any]
:param default_values:             which values should be initially selected
:type default_values:              List[Any]
:param select_mode:                Select modes are used to determine if only 1 item can be selected or multiple and how they can be selected.   Valid choices begin with "LISTBOX_SELECT_MODE_" and include: LISTBOX_SELECT_MODE_SINGLE LISTBOX_SELECT_MODE_MULTIPLE LISTBOX_SELECT_MODE_BROWSE LISTBOX_SELECT_MODE_EXTENDED
:type select_mode:                 [enum]
:param change_submits:             DO NOT USE. Only listed for backwards compat - Use enable_events instead
:type change_submits:              (bool)
:param enable_events:              Turns on the element specific events. Listbox generates events when an item is clicked
:type enable_events:               (bool)
:param bind_return_key:            If True, then the return key will cause a the Listbox to generate an event
:type bind_return_key:             (bool)
:param size:                       w=characters-wide, h=rows-high. If an int instead of a tuple is supplied, then height is auto-set to 1
:type size:                        (int, int) |  (int, None) | int
:param s:                          Same as size parameter.  It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, size will be used
:type s:                           (int, int)  | (None, None) | int
:param disabled:                   set disable state for element
:type disabled:                    (bool)
:param auto_size_text:             True if element should be the same size as the contents
:type auto_size_text:              (bool)
:param font:                       specifies the font family, size, etc.  Tuple or Single string format 'name size styles'. Styles: italic * roman bold normal underline overstrike
:type font:                        (str or (str, int[, str]) or None)
:param no_scrollbar:               Controls if a scrollbar should be shown.  If True, no scrollbar will be shown
:type no_scrollbar:                (bool)
:param horizontal_scroll:          Controls if a horizontal scrollbar should be shown.  If True a horizontal scrollbar will be shown in addition to vertical
:type horizontal_scroll:           (bool)
:param background_color:           color of background
:type background_color:            (str)
:param text_color:                 color of the text
:type text_color:                  (str)
:param highlight_background_color: color of the background when an item is selected. Defaults to normal text color (a reverse look)
:type highlight_background_color:  (str)
:param highlight_text_color:       color of the text when an item is selected. Defaults to the normal background color (a rerverse look)
:type highlight_text_color:        (str)
:param sbar_trough_color:           Scrollbar color of the trough
:type sbar_trough_color:            (str)
:param sbar_background_color:       Scrollbar color of the background of the arrow buttons at the ends AND the color of the "thumb" (the thing you grab and slide). Switches to arrow color when mouse is over
:type sbar_background_color:        (str)
:param sbar_arrow_color:            Scrollbar color of the arrow at the ends of the scrollbar (it looks like a button). Switches to background color when mouse is over
:type sbar_arrow_color:             (str)
:param sbar_width:                  Scrollbar width in pixels
:type sbar_width:                   (int)
:param sbar_arrow_width:            Scrollbar width of the arrow on the scrollbar. It will potentially impact the overall width of the scrollbar
:type sbar_arrow_width:             (int)
:param sbar_frame_color:            Scrollbar Color of frame around scrollbar (available only on some ttk themes)
:type sbar_frame_color:             (str)
:param sbar_relief:                 Scrollbar relief that will be used for the "thumb" of the scrollbar (the thing you grab that slides). Should be a constant that is defined at starting with "RELIEF_" - RELIEF_RAISED, RELIEF_SUNKEN, RELIEF_FLAT, RELIEF_RIDGE, RELIEF_GROOVE, RELIEF_SOLID
:type sbar_relief:                  (str)
:param key:                        Used with window.find_element and with return values to uniquely identify this element
:type key:                         str | int | tuple | object
:param k:                          Same as the Key. You can use either k or key. Which ever is set will be used.
:type k:                           str | int | tuple | object
:param pad:                        Amount of padding to put around element in pixels (left/right, top/bottom) or ((left, right), (top, bottom)) or an int. If an int, then it's converted into a tuple (int, int)
:type pad:                         (int, int) or ((int, int),(int,int)) or (int,(int,int)) or  ((int, int),int) | int
:param p:                          Same as pad parameter.  It's an alias. If EITHER of them are set, then the one that's set will be used. If BOTH are set, pad will be used
:type p:                           (int, int) or ((int, int),(int,int)) or (int,(int,int)) or  ((int, int),int) | int
:param tooltip:                    text, that will appear when mouse hovers over the element
:type tooltip:                     (str)
:param expand_x:                   If True the element will automatically expand in the X direction to fill available space
:type expand_x:                    (bool)
:param expand_y:                   If True the element will automatically expand in the Y direction to fill available space
:type expand_y:                    (bool)
:param right_click_menu:           A list of lists of Menu items to show when this element is right clicked. See user docs for exact format.
:type right_click_menu:            List[List[ List[str] | str ]]
:param visible:                    set visibility state of the element
:type visible:                     (bool)
:param metadata:                   User metadata that can be set to ANYTHING
:type metadata:                    (Any)

简单实例

表达式计算器

直接计算表达式的值:

代码如下: 

import PySimpleGUI as sg# 设置主题
sg.theme('SystemDefault1')# 控件布局
layout = [[sg.Text("输入表达式:"), sg.Input(key="expression", size=(40, 1))],[sg.Button("计算"), sg.Button("清除"), sg.Button("退出")],[sg.Text("结果:"), sg.Text(key="result", size=(40, 1))],
]# 创建窗口
window = sg.Window("计算器", layout)# 事件循环
while True:event, values = window.read()if event == sg.WINDOW_CLOSED or event == "退出":breakelif event == "清除":window["expression"].update("")elif event == "计算":try:expression = values["expression"]result = eval(expression)window["result"].update(result)except Exception as e:window["result"].update("错误:{}".format(e))window.close()

标准计算器 

外观看上去更像一点,缺点是没找到倒数和乘除法的全角符号略微有点没对齐所有的按钮。

代码如下:

import PySimpleGUI as sglayout = [[sg.Input(key="expression", default_text='0',readonly=True,justification='right',size=(20, 1), font=("",20))],[sg.Button("1/x", font=("Helvetica", 24)),sg.Button("C",font=("Helvetica", 24)),sg.Button("←",font=("Helvetica", 24)),sg.Button(" ÷ ", font=("Helvetica", 24))],[sg.Button(f' {i} ', key=f"num_{i}",font=("Helvetica", 24)) for i in range(7,10)]+[sg.Button(" x ",font=("Helvetica", 24))],[sg.Button(f' {i} ', key=f"num_{i}",font=("Helvetica", 24)) for i in range(4,7)]+[sg.Button("-",font=("Helvetica", 24))],[sg.Button(f' {i} ', key=f"num_{i}",font=("Helvetica", 24)) for i in range(1,4)]+[sg.Button("+",font=("Helvetica", 24))],[sg.Button(" ± ",font=("Helvetica", 24)),sg.Button(" 0 ", key="num_0",font=("Helvetica", 24)),sg.Button("  . ",font=("Helvetica", 24)),sg.Button("=", font=("Helvetica", 24))],
]window = sg.Window("计算器 by HannYang", layout)while True:event, values = window.read()if event == sg.WINDOW_CLOSED:breakelif event in ["num_{}".format(i) for i in range(10)]:expr = values["expression"]if expr=='0': expr = ''expr = expr + event[-1]window["expression"].update(expr)elif event == "  . ":expr = values["expression"]test = ''for c in expr[::-1]:if c not in '+-*/': test += celse: breakif test!='' and '.' not in test:expr += "."window["expression"].update(expr)elif event in ["+", "-", " x ", " ÷ "]:expr = values["expression"]if expr[-1] not in "+-*/.":expr += eventexpr = expr.replace("+","+").replace("-","-")expr = expr.replace(" x ","*").replace(" ÷ ","/")window["expression"].update(expr)elif event == "←":expr = values["expression"]if len(expr)>0:expr = expr[:-1]if not expr:expr = "0"window["expression"].update(expr)elif event == "1/x":try:expr = eval("1/"+values["expression"])window["expression"].update(expr)except Exception as e:window["expression"].update("错误:{}".format(e))elif event == " ± ":expr = values["expression"]if expr[0]=='-':expr = expr[1:]else:expr = '-'+exprwindow["expression"].update(expr)elif event == "=":try:result = eval(values["expression"])window["expression"].update(result)except Exception as e:window["expression"].update("错误:{}".format(e))elif event == "C":window["expression"].update("0")window.close()

小结

总之,PySimpleGUI是一个功能强大且易于使用的Python库,适用于那些想要快速构建出功能丰富的桌面应用程序的开发者。它的简洁语法和高级功能使得开发过程更加高效和愉快。无论你是初学者还是有经验的开发者,都可以尝试使用PySimpleGUI来创建出令人惊叹的GUI应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再薅!Pika全球开放使用;字节版GPTs免费不限量;大模型应用知识地图;MoE深度好文;2024年AIGC发展轨迹;李飞飞最新自传 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 👀 终于!AI视频生成平台 Pika 面向所有用户开放网页端 https://twitter.com/pika_labs Pika 营销很猛,讲述的「使…

qt中信号槽第五个参数

文章目录 connent函数第五个参数的作用自动连接(Qt::AutoConnection)直接连接(Qt::DirectConnection - 同步)同线程不同线程 队列连接(Qt::QueuedConnection - 异步)同一线程不同线程 锁定队列连接(Qt::BlockingQueuedConnection) connent函数第五个参数的作用 connect(const …

LSTM Siamese neural network

本文中的代码在Github仓库或Gitee仓库中可找到。 Hi, 你好。我是茶桁。 大家是否还记得,在「核心基础」课程中,我们讲过CNN以及LSTM。 卷积神经网络(CNN)已经在计算机视觉处理中得到广泛应用,不过,2017年…

Shell脚本自动化部署LAMP环境

[rootlocalhost ~]# vim liang.sh #!/bin/bash# LAMP终极部署cat <<-EOF-------------------------------------------------------------------------| LAMP终极部署 V1.0 |-------------------------------------------------------------------------| a. 部署Apache服…

Go 泛型之明确使用时机与泛型实现原理

Go 泛型之明确使用时机与泛型实现原理 文章目录 Go 泛型之明确使用时机与泛型实现原理一、引入二、何时适合使用泛型&#xff1f;场景一&#xff1a;编写通用数据结构时场景二&#xff1a;函数操作的是 Go 原生的容器类型时场景三&#xff1a;不同类型实现一些方法的逻辑相同时…

pycharm python环境安装

目录 1.Python安装 2.PyQt5介绍 3.安装pyuic 4.启动designer.exe 5.pyinstaller(打包发布程序) 6.指定源安装 7.PyQt5-tools安装失败处理 8.控件介绍 9.错误记录 1.NameError: name reload is not defined 10.开发记录 重写报文输出和文件 ​编辑 1.Python安装 点…

docker里面不能使用vim的解决办法

docker里面不能使用vim的解决办法 目录 docker里面不能使用vim的解决办法 1.在使用时会出现 2.在使用这些都不能解决的时候考虑 3.测试是否可用 1.在使用时会出现 bash: vim: command not found 出现这种错误时首先考虑使用 apt-get update 然后在用 apt-get install …

vue3中pinia的使用及持久化(详细解释)

解释一下pinia&#xff1a; Pinia是一个基于Vue3的状态管理库&#xff0c;它提供了类似Vuex的功能&#xff0c;但是更加轻量化和简单易用。Pinia的核心思想是将所有状态存储在单个store中&#xff0c;并且将store的行为和数据暴露为可响应的API&#xff0c;从而实现数据&#…

中国历史长河图

历史是一种传承和记忆&#xff0c;不管你是否承认&#xff0c;他就在那里。你也身处其中&#xff0c;就像一条小鱼身处波澜壮阔的大河中&#xff0c;没留下一点痕迹。 了解历史&#xff0c;不是只为了多知道些古代人物、历史事件&#xff0c;或者为了应付考试。而是应该想到&am…

今年努力输出的嵌入式Linux视频

今年努力了一波&#xff0c;几个月周六日无休&#xff0c;自己在嵌入式linux工作有些年头&#xff0c;结合自己也是一直和SLAM工程师对接&#xff0c;所以输出了一波面向SLAM算法工程师Linux课程&#xff0c;当然嵌入式入门的同学也可以学习。下面是合作的官方前面发的宣传文章…

【c++】使用vector存放键值对时,明明给vector的不同键赋了不同的值,但为什么前面键的值会被后面键的值给覆盖掉?

错误描述 运行程序得到结果如下图所示&#xff08;左边是原始数据&#xff0c;xxml文件中真实数据的样子&#xff0c;右图是程序运行得到的结果结果&#xff09;&#xff1a; 对比以上两图可以发现&#xff0c;右图中两个实例的三个属性值都来自左图中的第二个User实例&#x…

【模拟电路】软件Circuit JS

一、模拟电路软件Circuit JS 二、Circuit JS软件配置 三、Circuit JS 软件 常见的快捷键 四、Circuit JS软件基础使用 五、Circuit JS软件使用讲解 欧姆定律电阻的串联和并联电容器的充放电过程电感器和实现理想超导的概念电容阻止电压的突变&#xff0c;电感阻止电流的突变LR…

一二三应用开发平台文件处理设计与实现系列之3——后端统一封装设计与实现

背景 前面介绍了前端通过集成vue-simple-uploader实现了文件的上传&#xff0c;今天重点说一下后端的设计与实现。 功能需求梳理 从功能角度而言&#xff0c;实际主要就两项&#xff0c;一是上传&#xff0c;二是下载。其中上传在文件体积较大的情况下&#xff0c;为了加快上…

Hadoop安装笔记1单机/伪分布式配置_Hadoop3.1.3——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码&#xff0c;使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变&#xff0c;同时添加静态分区&#xff0c;分区字段为etl_date&#xff0c;类型为String&am…

年度总结 | 回味2023不平凡的一年

目录 前言1. 平台成就2. 自我提升3. Bug连连4. 个人展望 前言 每年CSDN的总结都不能落下&#xff0c;回顾去年&#xff1a;年度总结 | 回味2022不平凡的一年&#xff0c;在回忆今年&#xff0c;展望下年 1. 平台成就 平台造就我&#xff08;我也造就平台哈哈&#xff09; 每…

MATLAB中./和/,.*和*,.^和^的区别

MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别 MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别./ 和 / 的区别.//实验实验结果 .* 和 * 的区别.**实验实验结果 .^ 和^ 的区别.^n^n实验运行结果 MATLAB中./和/&#xff0c;.和&#xff0c;.^ 和^ 的区别 …

Plantuml之JSON数据语法介绍(二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

设计模式(4)--对象行为(11)--访问者

1. 意图 表示一个作用于某对象结构中的各元素的操作。 使你可以在不改变各元素的类的前提下定义于作用于这些元素的新操作。 2. 五种角色 抽象访问者(Visitor)、具体访问者(Concrete Visitor)、抽象元素(Element)、 具体元素(Concrete Element)、对象结构(ObjectStructure) 3…

学习笔记15——前端和http协议

学习笔记系列开头惯例发布一些寻亲消息&#xff0c;感谢关注&#xff01; 链接&#xff1a;https://baobeihuijia.com/bbhj/ 关系 客户端&#xff1a;对连接访问到的前端代码进行解析和渲染&#xff0c;就是浏览器的内核服务器端&#xff1a;按照规则编写前端界面代码 解析标准…

Mysql 高级语句

目录 高阶查询select语句&#xff1a; 显示表格中一个或数个字段的所有数据记录&#xff1a; 不显示重复的数据记录&#xff1a;distinct and且&#xff0c;or或 显示已知的值的数据记录&#xff1a;in 显示两个值范围内的数据记录&#xff1a;between 通配符&#xff1…