如何解决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()
总而言之,这将显示一个公司文件夹列表供我选择,当我单击一个文件夹时,我会看到实际选择的文件夹是什么,如下面的屏幕截图所示:
作为一个独立的程序,上面的页面工作得非常好。但是,当我尝试将其集成到我的主程序中时,如下所示:
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()
以识别您是否运行 page2a
或 page2b
# ---
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 举报,一经查实,本站将立刻删除。