PySimpleGUI 项目集成的“KeyError”

如何解决PySimpleGUI 项目集成的“KeyError”

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

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,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,auto_size_buttons=False,default_button_element_size=(12,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()


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

enter image description here

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

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'] ],['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!',25,BOLD))],[sg.Button('New Company')],[sg.Button('Existing Company')],[sg.Button('Exit')],]
    return sg.Window('Baseline Analyzer',element_justification='c',auto_size_text=False,default_button_element_size=(25,3),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: ',sg.InputText(key='Date')],[sg.Text('Location of Site: ',sg.InputText(key='Location')],[sg.Text('Department: ',sg.InputText(key='Department')],[sg.Text('Company Liaison Name: ',sg.InputText(key='Liaison')],[sg.Text('Company Liaison Email: ',sg.InputText(key='Contact')],[sg.Text('Company Liaison Number: ',sg.InputText(key='Number')],[sg.Button('Create Company'),sg.Button('Clear'),sg.Exit()]
    ]      

    return sg.Window('Generate Client Profile',finalize=True)

def page2b():

    company_list_column = [
        [sg.Text('Pick your company name')],enable_events=True)]
    ]

    company_column = [
        [sg.Text(size=(40,]

    layout = [
        [sg.Text('Select your Company',sg.Button('Close')]
    ]

    return sg.Window('Baseline Analyzer',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,event,values 中的值 - 它需要再次运行 sg.read_all_windows()

因此您应该直接在 if values['-EC-'] 中运行 while True。但是它将为每个窗口执行,因此您必须检查 if '-EC-' in values and values['-EC-'] 或者您必须检查 if window == window2 但它也需要使用 window2 = page2b() 而不是 window = page2b() 甚至更好window2b = page2b() 以识别您是否运行 page2apage2b

# ---

window1 = page1()
window2a = None
window2b = None

while True:      
    window,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,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

编辑:

其他想法是为每个窗口创建新的 while 循环,但有时它的工作方式可能与以前的版本不同。当 window2 打开时,它会阻止 window1 中的按钮,因此您不能同时打开两个 windows 2。以前的版本可以同时打开New Company','Existing Company - 它甚至可以打开许多Existing Company和许多'新公司 at the same time. This version can open only one 'New Company或只有一个Existing Company并且它可以打开{{1} } 同时。

在新版本中,当 New Company','Existing Company 打开时,您不能在 Exit 中使用 window1

我更改了 window2 中的路径以在我的系统上运行它。

listdir()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?