You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySimpleGUI中为Tabs添加密码保护?仅开放首个Tab

PySimpleGUI Tabs 密码保护实现方案

要实现首个Tab直接访问、其余Tab需密码验证的功能,可以通过监听Tab切换事件,拦截受保护Tab的访问请求,弹出密码验证窗口后再决定是否允许切换。以下是完整实现代码:

基础版(每次点击都需验证)

import PySimpleGUI as sg

# 自定义密码,可替换为实际需要的密码
CORRECT_PASSWORD = "secure_pass_123"

# 公开Tab布局
public_tab = [
    [sg.Text("这是无需验证的公开Tab")],
    [sg.Button("公开测试按钮")]
]

# 受保护Tab1布局
protected_tab1 = [
    [sg.Text("受保护Tab1 - 仅验证通过后可访问")],
    [sg.Input(key="-INPUT_PROT1-")]
]

# 受保护Tab2布局
protected_tab2 = [
    [sg.Text("受保护Tab2 - 仅验证通过后可访问")],
    [sg.Listbox(["机密项A", "机密项B"], size=(20,2), key="-LIST_PROT2-")]
]

# 主窗口布局
main_layout = [
    [sg.TabGroup([
        [sg.Tab("公开Tab", public_tab, key="-TAB_PUBLIC-")],
        [sg.Tab("受保护Tab1", protected_tab1, key="-TAB_PROT1-")],
        [sg.Tab("受保护Tab2", protected_tab2, key="-TAB_PROT2-")]
    ], key="-TAB_GROUP-")]
]

window = sg.Window("Tab密码保护示例", main_layout)
current_active_tab = "-TAB_PUBLIC-"  # 记录当前活跃Tab

while True:
    event, values = window.read()
    
    if event == sg.WIN_CLOSED:
        break
    
    # 处理受保护Tab的访问请求
    if event in ["-TAB_PROT1-", "-TAB_PROT2-"]:
        # 弹出密码输入框
        input_password = sg.popup_get_text("请输入访问密码:", password_char="*", title="身份验证")
        
        if input_password == CORRECT_PASSWORD:
            # 密码正确,切换到目标Tab
            current_active_tab = event
            window["-TAB_GROUP-"].set_current_tab(event)
        else:
            # 密码错误,返回原Tab并提示
            sg.popup("密码错误,无法访问该Tab", title="验证失败")
            window["-TAB_GROUP-"].set_current_tab(current_active_tab)
    
    # 处理公开Tab的按钮事件
    if event == "公开测试按钮":
        sg.popup("你点击了公开Tab的按钮")

window.close()

优化版(验证一次后永久放行)

如果希望用户验证过某个Tab后,后续点击无需重复输入密码,可以添加已验证Tab的记录集合:

import PySimpleGUI as sg

CORRECT_PASSWORD = "secure_pass_123"

public_tab = [
    [sg.Text("这是无需验证的公开Tab")],
    [sg.Button("公开测试按钮")]
]

protected_tab1 = [
    [sg.Text("受保护Tab1 - 仅验证通过后可访问")],
    [sg.Input(key="-INPUT_PROT1-")]
]

protected_tab2 = [
    [sg.Text("受保护Tab2 - 仅验证通过后可访问")],
    [sg.Listbox(["机密项A", "机密项B"], size=(20,2), key="-LIST_PROT2-")]
]

main_layout = [
    [sg.TabGroup([
        [sg.Tab("公开Tab", public_tab, key="-TAB_PUBLIC-")],
        [sg.Tab("受保护Tab1", protected_tab1, key="-TAB_PROT1-")],
        [sg.Tab("受保护Tab2", protected_tab2, key="-TAB_PROT2-")]
    ], key="-TAB_GROUP-")]
]

window = sg.Window("Tab密码保护示例(优化版)", main_layout)
current_active_tab = "-TAB_PUBLIC-"
verified_tabs = {"-TAB_PUBLIC-"}  # 公开Tab默认已验证

while True:
    event, values = window.read()
    
    if event == sg.WIN_CLOSED:
        break
    
    if event in ["-TAB_PROT1-", "-TAB_PROT2-"]:
        if event in verified_tabs:
            # 已验证过,直接切换
            current_active_tab = event
            window["-TAB_GROUP-"].set_current_tab(event)
        else:
            input_password = sg.popup_get_text("请输入访问密码:", password_char="*", title="身份验证")
            
            if input_password == CORRECT_PASSWORD:
                verified_tabs.add(event)
                current_active_tab = event
                window["-TAB_GROUP-"].set_current_tab(event)
            else:
                sg.popup("密码错误,无法访问该Tab", title="验证失败")
                window["-TAB_GROUP-"].set_current_tab(current_active_tab)
    
    if event == "公开测试按钮":
        sg.popup("你点击了公开Tab的按钮")

window.close()

核心逻辑说明

  • 通过sg.TabGroup的set_current_tab方法控制Tab的切换。
  • 用current_active_tab记录当前显示的Tab,确保密码错误时能切回原Tab。
  • 优化版中verified_tabs集合用于存储已通过验证的Tab key,避免重复验证。
  • 密码输入框使用popup_get_text并设置password_char="*"隐藏输入内容,提升安全性。

内容的提问来源于stack exchange,提问作者PyiPath2022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:01:12