"KeyError" 用于 PySimpleGUI 项目集成

"KeyError" for PySimpleGUI Project Integration

我一直在尝试将新页面集成到我正在做的项目中。

import PySimpleGUI as sg
import os
def page2b():

    company_list_column = [
        [sg.Text('Pick your company name')],
        [sg.Listbox(os.listdir("C:\/FYP\/GUI\/Companies"), size=(25, 5), key='-EC-', enable_events=True)]
    ]
    company_column = [
        [sg.Text(size=(40,1), key='-Company Selected-')],
        [sg.Text(size=(40,1), key='-Folder Selected-')],  
    ]
    layout = [
        [sg.Text('Select your Company', justification='center',font=("Arial",22))],
        [
        sg.Column(company_list_column),
        sg.VSeparator(),
        sg.Column(company_column),
        ],
        [sg.Button('Select Company'), sg.Button('Close')]
    ]
    return sg.Window('Baseline Analyzer', layout, default_element_size=(100, 1), auto_size_buttons=False,      
                     default_button_element_size=(12, 1), size=(600,270))
window= page2b() 
while True:                  # the event loop
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == "Close":
        break
    if values['-EC-']:    # if something is highlighted in the list
        window['-Company Selected-'].update(f"Company selected: {values['-EC-'][0]}")
        window['-Folder Selected-'].update(f"Your folder is: C:\FYP\GUI\Companies\{values['-EC-'][0]}")
    if event == "Select Company": #The path of the folder to store the things at
        word= {values['-EC-'][0]}
        word = "".join(word)
        foldername = "C:\FYP\GUI\Companies\" + word
        break
window.close()


总而言之,这会显示一个公司文件夹列表供我选择,当我单击一个文件夹时,我会看到所选文件夹确实是什么,如下面的屏幕截图所示:

作为一个独立的程序,上面的页面工作得非常好。然而,当我尝试将它集成到我的主程序中时,如下所示:

from tkinter.constants import UNDERLINE
from tkinter.font import BOLD, ITALIC
import PySimpleGUI as sg
from datetime import datetime, date, time
import time     
import csv
import pandas as pd
import os
from stat import S_IREAD, S_IRGRP, S_IROTH

sg.ChangeLookAndFeel('DarkTeal9')           

# ------ Menu Definition ------ #      
menu_def = [
    ['Company Selection',['New Company','Existing Company']],
    ['Help',['How to use']]
]
menu_def2 = [
    ['Scan Management', ['Start Audit Task']],      
    ['Baseline Management',  ['View Baselines'] ],      
    ['Help', ['How to Use']] 
]    

# ------ Functions Defintion ------ #
def clear_input():
    for key in values:
        if key != 'Import Host':
            window[key]('')
    return None  

def folder_gen():
    clientFolder = os.mkdir(values['New Client Name'])  

# ------ GUI Defintion ------ #
def page1():

    layout = [
        [sg.Menu(menu_def)],
        [sg.Text('Welcome to the Baseline Analyzer!', justification='center',font=("Arial",25, BOLD))],
        [sg.Button('New Company')],
        [sg.Button('Existing Company')],
        [sg.Button('Exit')],
    ]
    return sg.Window('Baseline Analyzer', layout,element_justification='c', default_element_size=(100, 1), auto_size_text=False, auto_size_buttons=False,      
                     default_button_element_size=(25, 3), size=(600,270), finalize=True)

def page_2a():
    layout = [
        [sg.Text('New Company Name: ', size=(20,1)), sg.InputText(key='New Client Name')],
        [sg.Text('Date of Registration: ', size=(20,1)), sg.InputText(key='Date')],
        [sg.Text('Location of Site: ', size=(20,1)), sg.InputText(key='Location')],
        [sg.Text('Department: ', size=(20,1)), sg.InputText(key='Department')],
        [sg.Text('Company Liaison Name: ', size=(20,1)), sg.InputText(key='Liaison')],
        [sg.Text('Company Liaison Email: ', size=(20,1)), sg.InputText(key='Contact')],
        [sg.Text('Company Liaison Number: ', size=(20,1)), sg.InputText(key='Number')],
        [sg.Button('Create Company'), sg.Button('Clear'), sg.Exit()]
    ]      

    return sg.Window('Generate Client Profile', layout,element_justification='c', default_element_size=(100, 1), auto_size_text=False, auto_size_buttons=False,      
                     default_button_element_size=(12, 1), size=(600,270), finalize=True)

def page2b():

    company_list_column = [
        [sg.Text('Pick your company name')],
        [sg.Listbox(os.listdir("C:\/FYP\/GUI\/Companies"), size=(25, 5), key='-EC-', enable_events=True)]
    ]

    company_column = [
        [sg.Text(size=(40,1), key='-Company Selected-')],
        [sg.Text(size=(40,1), key='-Folder Selected-')],
        
    ]

    layout = [
        [sg.Text('Select your Company', justification='center',font=("Arial",22))],
        [
        sg.Column(company_list_column),
        sg.VSeparator(),
        sg.Column(company_column),
        ],
        [sg.Button('Select Company'), sg.Button('Close')]
    ]

    return sg.Window('Baseline Analyzer', layout, default_element_size=(100, 1), auto_size_buttons=False,      
                     default_button_element_size=(12, 1), size=(600,270), finalize=True)

window1, window2= page1(), None                  

# ------ Loop & Process button menu choices ------ #  
    # ------ Process menu choices ------ #      

while True:      
    window, event, values = sg.read_all_windows()
    if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
        window.close()
        if window == window2:
            window2 = None
        elif window == window1:
            break           
    # Clear New Scan form inputs
    elif event == 'Clear':
        clear_input()
        #Exisiting Company selection page
    if event == 'New Company':
        window = page_2a()    
    elif event == 'Existing Company':
        window = page2b()
        if values['-EC-']:    # if something is highlighted in the list
            window['-Company Selected-'].update(f"Company selected: {values['-EC-'][0]}")
            window['-Folder Selected-'].update(f"Your folder is: C:\FYP\GUI\Companies\{values['-EC-'][0]}")
        if event == "Select Company": #The path of the folder to store the things at
            word= {values['-EC-'][0]}
            word = "".join(word)
            foldername = "C:\FYP\GUI\Companies\" + word
        
window.close()            

我遇到了这个“keyError”,一直在苦苦思索如何解决它

Traceback (most recent call last):
  File "c:\Users\******\Documents\******\******\testing.py", line 140, in <module>
    if values['-EC-']:    # if something is highlighted in the list
KeyError: '-EC-'

我的困境有解决办法吗?

window = page2b() 创建新的 window 但它不会更新 window, event, values 中的值 - 它需要再次 运行 sg.read_all_windows()

所以你应该 运行 if values['-EC-'] 直接在 while True 中。但它会为每个 window 执行,所以你必须检查 if '-EC-' in values and values['-EC-'] 或者你必须检查 if window == window2 但它还需要使用 window2 = page2b() 而不是 window = page2b() 甚至更好 window2b = page2b() 来识别你是 运行 page2a 还是 page2b

# ---

window1 = page1()
window2a = None
window2b = None

while True:      
    window, event, values = sg.read_all_windows()
    #print('window:', window)
    #print('event:', event)
    #print('values:', values)
    
    if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
        window.close()
        if window == window2a:
            window2a = None
        elif window == window2b:
            window2b = None
        elif window == window1:
            break           
    elif event == 'Clear':
        clear_input()

    # - events, values unique for every window -

    if window == window1:
        if event == 'New Company':
            window2a = page_2a()    
        elif event == 'Existing Company':
            window2b = page2b()

    elif window == window2a:
        # ... code ...
        pass
    
    elif window == window2b:
        if values['-EC-']:
            window['-Company Selected-'].update(f"Company selected: {values['-EC-'][0]}")
            window['-Folder Selected-'].update(f"Your folder is: C:\FYP\GUI\Companies\{values['-EC-'][0]}")
        if event == "Select Company":
            word = {values['-EC-'][0]}
            word = "".join(word)
            foldername = "C:\FYP\GUI\Companies\" + word
   
window.close()     

甚至

window1 = page1()
window2a = None
window2b = None

while True:      
    window, event, values = sg.read_all_windows()
    #print('window:', window)
    #print('event:', event)
    #print('values:', values)
    
    if window == window1:
        if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
            window.close()
            break
        elif event == 'New Company':
            window2a = page_2a()    
        elif event == 'Existing Company':
            window2b = page2b()

    elif window == window2a:
        if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
            window.close()
            window2a = None
        elif event == 'Clear':
            clear_input()
    
    elif window == window2b:
        if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
            window.close()
            window2b = None
        elif values['-EC-']:
            window['-Company Selected-'].update(f"Company selected: {values['-EC-'][0]}")
            window['-Folder Selected-'].update(f"Your folder is: C:\FYP\GUI\Companies\{values['-EC-'][0]}")
        elif event == "Select Company":
            word = {values['-EC-'][0]}
            word = "".join(word)
            foldername = "C:\FYP\GUI\Companies\" + word

编辑:

另一个想法是为每个 window 创建新的 while 循环,但有时它可能与以前的版本不同。当 window2 打开时,它会阻止 window1 中的按钮,因此您不能同时打开两个 windows 2。以前的版本可以同时打开New Company','Existing Company - 它甚至可以打开很多Existing Company和很多'New Company at the same time. This version can open only one 'New Company或者只能打开一个Existing Company并且它可以打开New Company','Existing Company 同时

并且在新版本中,当 window2 打开时,您不能在 window1 中使用 Exit

我在我的系统上将 listdir() 中的路径更改为 运行。

from tkinter.constants import UNDERLINE
from tkinter.font import BOLD, ITALIC
import PySimpleGUI as sg
from datetime import datetime, date, time
import time     
import csv
import pandas as pd
import os
from stat import S_IREAD, S_IRGRP, S_IROTH

sg.ChangeLookAndFeel('DarkTeal9')           

# ------ Menu Definition ------ #    

menu_def = [
    ['Company Selection',['New Company','Existing Company']],
    ['Help',['How to use']]
]
menu_def2 = [
    ['Scan Management', ['Start Audit Task']],      
    ['Baseline Management',  ['View Baselines'] ],      
    ['Help', ['How to Use']] 
]    

# ------ Functions Defintion ------ #

def clear_input():
    for key in values:
        if key != 'Import Host':
            window[key]('')
    return None  

def folder_gen():
    clientFolder = os.mkdir(values['New Client Name'])  

# ------ GUI Defintion ------ #
def page1():

    layout = [
        [sg.Menu(menu_def)],
        [sg.Text('Welcome to the Baseline Analyzer!', justification='center',font=("Arial",25, BOLD))],
        [sg.Button('New Company')],
        [sg.Button('Existing Company')],
        [sg.Button('Exit')],
    ]
    
    window = sg.Window('Baseline Analyzer', layout,element_justification='c', default_element_size=(100, 1), auto_size_text=False, auto_size_buttons=False,      
                     default_button_element_size=(25, 3), size=(600,270), finalize=True)

    while True:      
        event, values = window.read()
        #print('window:', window)
        #print('event:', event)
        #print('values:', values)
        
        if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
            window.close()
            return
        elif event == 'New Company':
            page_2a()    
        elif event == 'Existing Company':
            page2b()

def page_2a():
    layout = [
        [sg.Text('New Company Name: ', size=(20,1)), sg.InputText(key='New Client Name')],
        [sg.Text('Date of Registration: ', size=(20,1)), sg.InputText(key='Date')],
        [sg.Text('Location of Site: ', size=(20,1)), sg.InputText(key='Location')],
        [sg.Text('Department: ', size=(20,1)), sg.InputText(key='Department')],
        [sg.Text('Company Liaison Name: ', size=(20,1)), sg.InputText(key='Liaison')],
        [sg.Text('Company Liaison Email: ', size=(20,1)), sg.InputText(key='Contact')],
        [sg.Text('Company Liaison Number: ', size=(20,1)), sg.InputText(key='Number')],
        [sg.Button('Create Company'), sg.Button('Clear'), sg.Exit()]
    ]      

    window = sg.Window('Generate Client Profile', layout,element_justification='c', default_element_size=(100, 1), auto_size_text=False, auto_size_buttons=False,      
                     default_button_element_size=(12, 1), size=(600,270), finalize=True)

    while True:      
        event, values = window.read()
        #print('window:', window)
        #print('event:', event)
        #print('values:', values)
        
        if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
            window.close()
            return
        elif event == 'Clear':
            clear_input()

def page2b():

    company_list_column = [
        [sg.Text('Pick your company name')],
        [sg.Listbox(os.listdir(), size=(25, 5), key='-EC-', enable_events=True)]
    ]

    company_column = [
        [sg.Text(size=(40,1), key='-Company Selected-')],
        [sg.Text(size=(40,1), key='-Folder Selected-')],
        
    ]

    layout = [
        [sg.Text('Select your Company', justification='center',font=("Arial",22))],
        [
        sg.Column(company_list_column),
        sg.VSeparator(),
        sg.Column(company_column),
        ],
        [sg.Button('Select Company'), sg.Button('Close')]
    ]

    window = sg.Window('Baseline Analyzer', layout, default_element_size=(100, 1), auto_size_buttons=False,      
                     default_button_element_size=(12, 1), size=(600,270), finalize=True)

    while True:      
        event, values = window.read()
        #print('window:', window)
        #print('event:', event)
        #print('values:', values)
        
        if event == sg.WIN_CLOSED or event == 'Exit'or event =='Close':
            window.close()
            return
        elif values['-EC-']:
            window['-Company Selected-'].update(f"Company selected: {values['-EC-'][0]}")
            window['-Folder Selected-'].update(f"Your folder is: C:\FYP\GUI\Companies\{values['-EC-'][0]}")
        if event == "Select Company":
            word = {values['-EC-'][0]}
            word = "".join(word)
            foldername = "C:\FYP\GUI\Companies\" + word

# --- start ---

page1()