入门版

下面是几个全面展示PySimpleGUI模块用法的示例,并附有详细的代码注释,帮助你更好地掌握该模块的使用。

示例1:简单的输入输出界面

这是一个基础的GUI示例,展示了如何使用文本输入框、按钮和文本输出框。

import PySimpleGUI as sg

# 定义布局
layout = [
    [sg.Text("请输入您的名字:")],  # 标签组件
    [sg.InputText(key="-NAME-")],  # 输入框,key用于后续访问输入值
    [sg.Button("提交"), sg.Button("退出")],  # 按钮
    [sg.Text("", size=(40, 1), key="-OUTPUT-")]  # 显示输出的文本框
]

# 创建窗口
window = sg.Window("简单输入输出示例", layout)

# 事件循环,处理事件和输入
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "提交":
        name = values["-NAME-"]  # 获取输入框的值
        window["-OUTPUT-"].update(f"你好,{name}!")  # 更新输出文本

# 关闭窗口
window.close()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

示例2:文件选择对话框

这个示例展示了如何使用文件选择对话框,用户可以选择文件并显示其路径。

import PySimpleGUI as sg

# 定义布局
layout = [
    [sg.Text("请选择一个文件:")],
    [sg.Input(), sg.FileBrowse()],  # 文件浏览按钮
    [sg.Button("确定"), sg.Button("退出")],
    [sg.Text("您选择的文件路径是:", size=(40, 1), key="-OUTPUT-")]
]

# 创建窗口
window = sg.Window("文件选择示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "确定":
        file_path = values[0]  # 获取文件路径
        window["-OUTPUT-"].update(f"路径: {file_path}")

# 关闭窗口
window.close()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

示例3:带有进度条的长时间任务

这个示例展示了如何使用进度条来显示任务的进度。

import PySimpleGUI as sg
import time

# 定义布局
layout = [
    [sg.Text("任务进行中...")],
    [sg.ProgressBar(100, orientation='h', size=(20, 20), key='-PROG-')],
    [sg.Button("开始"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("进度条示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "开始":
        for i in range(100):
            time.sleep(0.1)  # 模拟长时间任务
            window['-PROG-'].update(i + 1)  # 更新进度条

# 关闭窗口
window.close()
  • 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.

示例4:选项卡布局

这个示例展示了如何创建包含多个选项卡的界面。

import PySimpleGUI as sg

# 定义选项卡内容
tab1_layout = [
    [sg.Text("这是第一个选项卡")],
    [sg.InputText("输入一些内容", key="-TAB1_INPUT-")]
]

tab2_layout = [
    [sg.Text("这是第二个选项卡")],
    [sg.Button("点击我", key="-TAB2_BUTTON-")]
]

# 定义选项卡
layout = [
    [sg.TabGroup([[sg.Tab("选项卡1", tab1_layout), sg.Tab("选项卡2", tab2_layout)]])],
    [sg.Button("确定"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("选项卡示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "确定":
        sg.popup(f"你在第一个选项卡中输入了: {values['-TAB1_INPUT-']}")
    if event == "-TAB2_BUTTON-":
        sg.popup("你点击了第二个选项卡中的按钮")

# 关闭窗口
window.close()
  • 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.

示例5:下拉菜单与滑块

这个示例展示了如何使用下拉菜单和滑块组件。

import PySimpleGUI as sg

# 定义布局
layout = [
    [sg.Text("请选择一个选项:")],
    [sg.Combo(['选项1', '选项2', '选项3'], key='-COMBO-')],  # 下拉菜单
    [sg.Text("选择一个值:")],
    [sg.Slider(range=(1, 100), orientation='h', size=(20, 20), key='-SLIDER-')],  # 滑块
    [sg.Button("确定"), sg.Button("退出")],
    [sg.Text("", size=(40, 1), key="-OUTPUT-")]
]

# 创建窗口
window = sg.Window("下拉菜单与滑块示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "确定":
        combo_value = values['-COMBO-']
        slider_value = values['-SLIDER-']
        window['-OUTPUT-'].update(f"选择了: {combo_value}, 值为: {slider_value}")

# 关闭窗口
window.close()
  • 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.

通过这些示例,你可以全面掌握PySimpleGUI的各种基本组件和功能,并能根据需要扩展和应用这些知识。


中等难度

以下是几个中等难度的PySimpleGUI应用示例,涵盖了更复杂的功能和布局设置,帮助你进一步掌握该模块的使用。

示例1:带有子窗口的主窗口

这个示例展示了如何在主窗口中打开和管理子窗口。

import PySimpleGUI as sg

# 主窗口布局
main_layout = [
    [sg.Text("主窗口")],
    [sg.Button("打开子窗口"), sg.Button("退出")]
]

# 创建主窗口
main_window = sg.Window("主窗口", main_layout)

# 事件循环
while True:
    event, values = main_window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "打开子窗口":
        # 子窗口布局
        sub_layout = [
            [sg.Text("这是一个子窗口")],
            [sg.InputText("在这里输入一些内容")],
            [sg.Button("关闭")]
        ]
        # 创建子窗口
        sub_window = sg.Window("子窗口", sub_layout)
        
        # 子窗口事件循环
        while True:
            sub_event, sub_values = sub_window.read()
            if sub_event == sg.WINDOW_CLOSED or sub_event == "关闭":
                break
        sub_window.close()

# 关闭主窗口
main_window.close()
  • 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.

示例2:带有菜单栏的多功能应用

这个示例展示了如何创建一个带有菜单栏的多功能应用,用户可以通过菜单栏选择不同的功能。

import PySimpleGUI as sg

# 定义菜单栏
menu_def = [
    ['文件', ['打开', '保存', '---', '退出']],
    ['编辑', ['剪切', '复制', '粘贴']],
    ['帮助', ['关于']]
]

# 主窗口布局
layout = [
    [sg.Menu(menu_def)],
    [sg.Text("请选择菜单中的操作")],
    [sg.Multiline(size=(40, 10), key='-MULTILINE-')]
]

# 创建窗口
window = sg.Window("菜单栏示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == '退出':
        break
    elif event == '打开':
        file_path = sg.popup_get_file('选择一个文件')
        if file_path:
            with open(file_path, 'r', encoding='utf-8') as file:
                window['-MULTILINE-'].update(file.read())
    elif event == '保存':
        file_path = sg.popup_get_file('保存文件为', save_as=True)
        if file_path:
            with open(file_path, 'w', encoding='utf-8') as file:
                file.write(values['-MULTILINE-'])
    elif event == '剪切':
        window['-MULTILINE-'].Widget.event_generate("<<Cut>>")
    elif event == '复制':
        window['-MULTILINE-'].Widget.event_generate("<<Copy>>")
    elif event == '粘贴':
        window['-MULTILINE-'].Widget.event_generate("<<Paste>>")
    elif event == '关于':
        sg.popup('这是一个示例应用程序', title='关于')

# 关闭窗口
window.close()
  • 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.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

示例3:表格显示与数据处理

这个示例展示了如何在PySimpleGUI中使用表格来显示数据,并实现简单的数据处理功能。

import PySimpleGUI as sg

# 表格数据
data = [
    ["Alice", 25, "Engineer"],
    ["Bob", 30, "Doctor"],
    ["Charlie", 35, "Teacher"]
]

# 定义表格头
header = ["Name", "Age", "Profession"]

# 布局
layout = [
    [sg.Table(values=data, headings=header, max_col_width=25,
              auto_size_columns=True, display_row_numbers=True,
              justification='right', num_rows=10, key='-TABLE-')],
    [sg.Button("添加行"), sg.Button("删除行"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("表格示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == "添加行":
        new_data = sg.popup_get_text("输入新行数据,用逗号分隔 (例如:David,40,Lawyer)")
        if new_data:
            data.append(new_data.split(","))
            window['-TABLE-'].update(values=data)
    elif event == "删除行":
        selected = values['-TABLE-']
        if selected:
            del data[selected[0]]
            window['-TABLE-'].update(values=data)

# 关闭窗口
window.close()
  • 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.
  • 38.
  • 39.
  • 40.
  • 41.

示例4:用户登录界面

这个示例展示了如何创建一个简单的用户登录界面,并验证用户名和密码。

import PySimpleGUI as sg

# 模拟用户数据
user_data = {
    "user1": "password1",
    "user2": "password2"
}

# 登录窗口布局
layout = [
    [sg.Text("用户名")],
    [sg.Input(key="-USERNAME-")],
    [sg.Text("密码")],
    [sg.Input(password_char="*", key="-PASSWORD-")],
    [sg.Button("登录"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("用户登录界面", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    if event == "登录":
        username = values["-USERNAME-"]
        password = values["-PASSWORD-"]
        if username in user_data and user_data[username] == password:
            sg.popup("登录成功", title="成功")
        else:
            sg.popup("用户名或密码错误", title="错误")

# 关闭窗口
window.close()
  • 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.

示例5:可调整窗口大小的图像查看器

这个示例展示了如何创建一个可调整窗口大小的图像查看器,用户可以加载并查看图像。

import PySimpleGUI as sg
from PIL import Image

# 布局
layout = [
    [sg.Text("图像查看器")],
    [sg.Image(key="-IMAGE-")],
    [sg.Button("加载图像"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("图像查看器", layout, resizable=True)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == "加载图像":
        file_path = sg.popup_get_file("选择图像文件")
        if file_path:
            # 使用PIL加载并调整图像大小以适应窗口
            image = Image.open(file_path)
            image.thumbnail((window.size[0] - 20, window.size[1] - 60))
            bio = sg.io.BytesIO()
            image.save(bio, format="PNG")
            window["-IMAGE-"].update(data=bio.getvalue())

# 关闭窗口
window.close()
  • 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.

这些中等难度的示例展示了更复杂的布局、事件处理和数据操作,帮助你更深入地了解和应用PySimpleGUI模块。


进阶版

以下是几个复杂的PySimpleGUI应用示例,涵盖更高级的功能,并附有详细注释,帮助你作为初学者进阶学习。

示例1:动态表单生成与数据处理

这个示例展示了如何根据用户选择动态生成表单,并处理用户输入的数据。

import PySimpleGUI as sg

# 初始布局
layout = [
    [sg.Text("请选择一个表单类型:")],
    [sg.Combo(['个人信息', '地址信息', '支付信息'], key='-FORM_TYPE-', enable_events=True)],  # 下拉菜单,enable_events=True允许实时触发事件
    [sg.Button("提交"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("动态表单生成", layout)

# 动态表单组件列表
dynamic_form = []

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == '-FORM_TYPE-':
        form_type = values['-FORM_TYPE-']
        
        # 清除旧的动态表单组件
        for element in dynamic_form:
            window[element].update(visible=False)
        dynamic_form.clear()

        # 根据选择的表单类型生成新的表单
        if form_type == '个人信息':
            dynamic_form = [
                sg.Text('姓名:'), sg.Input(key='-NAME-'),
                sg.Text('年龄:'), sg.Input(key='-AGE-')
            ]
        elif form_type == '地址信息':
            dynamic_form = [
                sg.Text('街道:'), sg.Input(key='-STREET-'),
                sg.Text('城市:'), sg.Input(key='-CITY-'),
                sg.Text('邮编:'), sg.Input(key='-ZIP-')
            ]
        elif form_type == '支付信息':
            dynamic_form = [
                sg.Text('信用卡号:'), sg.Input(key='-CARD-'),
                sg.Text('有效期:'), sg.Input(key='-EXPIRY-'),
                sg.Text('CVV:'), sg.Input(key='-CVV-')
            ]
        
        # 将新生成的表单组件添加到窗口布局
        window.extend_layout(window, [[sg.Column([[element] for element in dynamic_form], key='-DYNAMIC_FORM-')]])

    elif event == '提交':
        sg.popup('表单数据', values)

# 关闭窗口
window.close()
  • 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.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.

示例2:多窗口交互与数据共享

这个示例展示了如何创建多个窗口并在它们之间共享数据。

import PySimpleGUI as sg

# 主窗口布局
layout_main = [
    [sg.Text("主窗口")],
    [sg.Input("在这里输入", key='-MAIN_INPUT-')],
    [sg.Button("打开子窗口"), sg.Button("退出")]
]

# 创建主窗口
main_window = sg.Window("主窗口", layout_main)

# 事件循环
while True:
    event, values = main_window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == "打开子窗口":
        sub_layout = [
            [sg.Text("子窗口")],
            [sg.Text(f"从主窗口传递的数据:{values['-MAIN_INPUT-']}")],  # 从主窗口获取输入数据并显示
            [sg.Input("子窗口输入", key='-SUB_INPUT-')],
            [sg.Button("返回主窗口"), sg.Button("关闭子窗口")]
        ]
        sub_window = sg.Window("子窗口", sub_layout, modal=True)  # modal=True表示子窗口打开时主窗口不可操作
        
        while True:
            sub_event, sub_values = sub_window.read()
            if sub_event == sg.WINDOW_CLOSED or sub_event == "关闭子窗口":
                break
            elif sub_event == "返回主窗口":
                main_window['-MAIN_INPUT-'].update(sub_values['-SUB_INPUT-'])  # 将子窗口的数据返回主窗口
                
        sub_window.close()

# 关闭主窗口
main_window.close()
  • 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.

示例3:复杂的布局管理与事件处理

这个示例展示了如何创建复杂布局,包括多列、多行、多选项卡的界面,并处理不同区域的事件。

import PySimpleGUI as sg

# 选项卡布局
tab1_layout = [
    [sg.Text("选项卡1内容")],
    [sg.InputText("输入一些内容", key="-TAB1_INPUT-")],
    [sg.Button("按钮1", key="-TAB1_BTN-")]
]

tab2_layout = [
    [sg.Text("选项卡2内容")],
    [sg.Slider(range=(0, 100), orientation='h', size=(20, 20), key='-SLIDER-')],
    [sg.Button("按钮2", key="-TAB2_BTN-")]
]

# 主窗口布局
layout = [
    [sg.Menu([['文件', ['退出']], ['帮助', ['关于']]])],
    [sg.TabGroup([[sg.Tab("选项卡1", tab1_layout), sg.Tab("选项卡2", tab2_layout)]], key="-TABS-")],  # TabGroup用于多选项卡布局
    [sg.Text("状态栏", size=(40, 1), key="-STATUS-")],
    [sg.Button("退出")]
]

# 创建窗口
window = sg.Window("复杂布局示例", layout, finalize=True)  # finalize=True确保窗口在显示前已经完全初始化

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == "关于":
        sg.popup("这是一个复杂布局的示例应用程序", title="关于")
    elif event == "-TAB1_BTN-":
        window['-STATUS-'].update(f"在选项卡1中输入了: {values['-TAB1_INPUT-']}")  # 更新状态栏
    elif event == "-TAB2_BTN-":
        window['-STATUS-'].update(f"在选项卡2中滑动值: {values['-SLIDER-']}")

# 关闭窗口
window.close()
  • 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.
  • 38.
  • 39.
  • 40.

示例4:异步任务处理与实时更新

这个示例展示了如何处理异步任务,并实时更新界面。

import PySimpleGUI as sg
import threading
import time

# 任务函数
def long_task(window):
    for i in range(10):
        time.sleep(1)  # 模拟长时间任务
        window.write_event_value('-PROGRESS-', i+1)  # 将进度传递回主线程

# 主窗口布局
layout = [
    [sg.Text("异步任务处理示例")],
    [sg.ProgressBar(10, orientation='h', size=(20, 20), key='-PROGRESSBAR-')],
    [sg.Button("开始任务"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("异步任务示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == "开始任务":
        threading.Thread(target=long_task, args=(window,), daemon=True).start()  # 启动异步任务
    elif event == '-PROGRESS-':
        window['-PROGRESSBAR-'].update(values[event])  # 实时更新进度条

# 关闭窗口
window.close()
  • 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.

示例5:树形结构展示与操作

这个示例展示了如何创建一个树形结构,并在其中添加、删除节点。

import PySimpleGUI as sg

# 定义树形结构数据
tree_data = sg.TreeData()
tree_data.Insert("", "_A", "节点A", [1, 2, 3])  # 插入根节点A
tree_data.Insert("_A", "_A1", "节点A1", [4, 5, 6])  # 在A下插入子节点A1
tree_data.Insert("", "_B", "节点B", [7, 8, 9])  # 插入根节点B

# 布局
layout = [
    [sg.Tree(data=tree_data, headings=["数据"], auto_size_columns=True,
             num_rows=10, col0_width=20, key="-TREE-", show_expanded=False)],  # show_expanded=False初始时不展开树
    [sg.Button("添加节点"), sg.Button("删除节点"), sg.Button("退出")]
]

# 创建窗口
window = sg.Window("树形结构示例", layout)

# 事件循环
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == "退出":
        break
    elif event == "添加节点":
        selected_node = values["-TREE-"][0] if values["-TREE-"] else ""  # 获取选中的节点
        new_node_key = sg.popup_get_text("输入新节点名称")
        if new_node_key:
            tree_data.Insert(selected_node, new_node_key, new_node_key, [])  # 插入新节点
            window["-TREE-"].update(tree_data)
    elif event == "删除节点":
        selected_node = values["-TREE-"][0] if values["-TREE-"] else None
        if selected_node:
            tree_data.Delete(selected_node)  # 删除选中的节点
           

  • 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.