PySimpleGUI实现用户输入存储至Python字典的问题
问题:PySimpleGUI输入无法正确存入字典
我正在构建一个用户图形界面,允许用户输入数值,界面已能正常运行,但希望后续可再次访问这些用户输入,将所有输入项(键)和对应答案(值)存储到一个dict中。然而我无法正确实现键值对的字典存储,尝试用for循环实现后,得到的字典不符合预期。
问题代码
import PySimpleGUI as sg sg.theme('DarkTeal9') layout = [ [sg.Text('Bitte füllen Sie alle Felder aus:')], [sg.Text('Betrachtetes System:', size=(15,1)), sg.Combo(['HTWP ','KS '], key = 'System')], [sg.Text('Zinsfaktor [bitte gleicher Zinsfaktor für HTWP & KS]:', size=(25,2)), sg.InputText(key='q')], [sg.Text('Betrachtungszeitraum [bitte gleicher Betrachtungszeitraum für HTWP & KS]:', size=(25,3)), sg.InputText(key='T')], [sg.Text('Preisänderungsfaktor Investition:', size=(25,1)), sg.InputText(key='r0')], [sg.Text('Nutzungsdauer: ', size=(25,1)), sg.InputText(key='T_N')], [sg.Text('Prozentsatz Förderung:', size=(25,1)), sg.InputText(key='F')], [sg.Text('Wärmemenge Senke [kW]:', size=(25,1)), sg.InputText(key='Q_Senke')], [sg.Text('COP:', size=(25,1)), sg.InputText(key='COP')], [sg.Text('Elektrische Leistung [kW]:', size=(25,1)), sg.InputText(key='P_El')], [sg.Text('Stromkosten [€/kWh]:', size=(25,1)), sg.InputText(key='S_Kosten')], [sg.Text('Volllaststunden [h]:', size=(25,1)), sg.InputText(key='VLast_h')], # Stromb_a # Wärmeb_a [sg.Text('Lohnkosten [€/h]:', size=(25,1)), sg.InputText(key='Lohn_h')], [sg.Text('Anzahl Arbeitsstunden:', size=(25,1)), sg.InputText(key='Anz_Arbeits_h')], [sg.Text('Preisänderungsfaktor Strom:', size=(25,1)), sg.InputText(key='r_v')], [sg.Text('Preisänderungsfaktor Stundenlohn:', size=(25,1)), sg.InputText(key='r_b')], [sg.Text('Faktor für den Aufwand bei der Wartung und Inspektion:', size=(25,2)), sg.InputText(key='f_w_insp')], [sg.Text('Faktor für den Aufwand bei der Instandsetzung:', size=(25,2)), sg.InputText(key='f_inst ')], [sg.Submit(),sg.Button('Clear'),sg.Exit()] ] window = sg.Window('Definition Parameter',layout) global HTWP_Daten HTWP_Daten = {} def clear_input(): for key in values: window[key]('') return None while True: event, values = window.read() if event == sg.WIN_CLOSED or event == 'Exit': break if event == 'Clear': clear_input() if event == 'Submit': # Create a Dict to save the Input for later for key in values: HTWP_Daten[key]= values print(HTWP_Daten) window.close()
错误输出
{'System': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'q': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'T': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'r0': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'T_N': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'F': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'Q_Senke': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'COP': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'P_El': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'S_Kosten': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'VLast_h': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'Lohn_h': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'Anz_Arbeits_h': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'r_v': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'r_b': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'f_w_insp': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}, 'f_inst ': {'System': 'HTWP ', 'q': '12', 'T': '234', 'r0': '567', 'T_N': '43', 'F': '22', 'Q_Senke': '34', 'COP': '22', 'P_El': '11', 'S_Kosten': '33', 'VLast_h': '22', 'Lohn_h': '11', 'Anz_Arbeits_h': '33', 'r_v': '22', 'r_b': '11', 'f_w_insp': '22', 'f_inst ': '444'}}
解决方案
问题出在Submit事件的循环逻辑里:你把整个values字典赋值给了HTWP_Daten的每个键,导致每个键对应的都是完整的输入字典,而不是单个输入值。
正确写法(两种方式)
- 直接复制values字典(推荐,最简单)
values本身就是PySimpleGUI返回的包含所有输入键值对的字典,直接用copy()方法复制即可:
if event == 'Submit': HTWP_Daten = values.copy() print(HTWP_Daten)
- 手动循环赋值(演示正确逻辑)
如果一定要用循环,要给每个键赋值对应的values[key],而不是整个values字典:
if event == 'Submit': HTWP_Daten.clear() # 先清空旧数据 for key in values: HTWP_Daten[key] = values[key] print(HTWP_Daten)
修改后的完整代码
import PySimpleGUI as sg sg.theme('DarkTeal9') layout = [ [sg.Text('Bitte füllen Sie alle Felder aus:')], [sg.Text('Betrachtetes System:', size=(15,1)), sg.Combo(['HTWP ','KS '], key = 'System')], [sg.Text('Zinsfaktor [bitte gleicher Zinsfaktor für HTWP & KS]:', size=(25,2)), sg.InputText(key='q')], [sg.Text('Betrachtungszeitraum [bitte gleicher Betrachtungszeitraum für HTWP & KS]:', size=(25,3)), sg.InputText(key='T')], [sg.Text('Preisänderungsfaktor Investition:', size=(25,1)), sg.InputText(key='r0')], [sg.Text('Nutzungsdauer: ', size=(25,1)), sg.InputText(key='T_N')], [sg.Text('Prozentsatz Förderung:', size=(25,1)), sg.InputText(key='F')], [sg.Text('Wärmemenge Senke [kW]:', size=(25,1)), sg.InputText(key='Q_Senke')], [sg.Text('COP:', size=(25,1)), sg.InputText(key='COP')], [sg.Text('Elektrische Leistung [kW]:', size=(25,1)), sg.InputText(key='P_El')], [sg.Text('Stromkosten [€/kWh]:', size=(25,1)), sg.InputText(key='S_Kosten')], [sg.Text('Volllaststunden [h]:', size=(25,1)), sg.InputText(key='VLast_h')], # Stromb_a #
相关产品推荐
相关产品推荐

