动态更新多个 Window 设置中的元素

Dynamically Updating an Element in a Multiple Window Setup

我有一个关于在多个 window 设置中动态更新字段的快速问题,例如上面的示例。我想要它,以便当用户 selects 自动填充时,值 [SAVEINVENTORYPATH] 被打印到设置 window 中的 'testinputtext' 字段但是当我使用 window.update 时,它会搜索对于主要 window 中的键,而不是设置 window 中的键。如何将 PySimpleGUI 指向设置 window?

编辑:感谢您的帮助,我已经编辑了代码并且自动填充功能有效,但是目前,Autofill 似乎冻结了 window但我希望人们能够 select Autofill 然后点击 Save 然后 Settings window 刷新但是我不确定当前放在哪里while True 循环。再次感谢您对此的帮助。

def create_settings_window(settings):
   sg.theme('LightGrey6')
   settings = load_settings(SETTINGS_FILE, DEFAULT_SETTINGS )
   def TextLabel(text): return sg.Text(text+':', justification='r', size=(20,1))


   layout = [  [sg.Text('Set Up Connection', font='Any 15')],
            [TextLabel('Inventory List'), sg.Input(key='SAVEINVENTORYPATH'), sg.FileBrowse(key='INVENTORYLIST')],
            [sg.Text(text='', key = 'testinputtext')],
            [sg.Button('Save'), sg.Button('Autofill'), sg.Button('Exit')]  ]

   window = sg.Window('Settings', layout, keep_on_top=True, finalize=True,element_padding = (3,3.5))

   test = window['testinputtext']
   event, values = window.read()

   if event == 'Autofill':
      test.update(value = 'hi')

   if event == 'Save':
      save_settings(SETTINGS_FILE, settings, values)
      sg.popup('Settings saved')
  else:
    print(event, values)

   for key in SETTINGS_KEYS_TO_ELEMENT_KEYS:  
    try:
        window[SETTINGS_KEYS_TO_ELEMENT_KEYS[key]].update(value=settings[key])
    except Exception as e:
        print(f'Problem updating PySimpleGUI window from settings. Key = {key}')
    
return window

def main():
  window, settings = None, load_settings(SETTINGS_FILE, DEFAULT_SETTINGS )
  while True:             # Event Loop
    #LAYOUT
    if window is None:
        settings = load_settings(SETTINGS_FILE, DEFAULT_SETTINGS )
        sg.theme('LightGrey6')
        

        layout = [[sg.Multiline(size=(180,10),key='Output',pad=(0,20))],
                  [sg.Button(button_text = 'Settings',key='Settings'),sg.Button(button_text = 'Load Output',key='LOAD_OUTPUT'),sg.Exit()]]
       
        window = sg.Window('Settings Dynamic Update Test', layout, element_justification='center', size= (600,300))
    
    event, values = window.read()


    if event == sg.WIN_CLOSED or event == 'Exit':
        break
        window.close()    
        
    if event == 'Settings':
        create_settings_window(settings)
            
    else:
        print(event, values)
    
  window.close()
main()
    

最好在它自己的事件循环中处理每个 window,将 windows 混合在一起可能会使事情变得困难或复杂。

以下示例显示了要走的路。

import PySimpleGUI as sg

def popup():
    sg.theme('DarkBlue4')
    layout = [
        [sg.Text("You name"), sg.Input("", key='Name')],
        [sg.Text("", size=0, key='Test')],
        [sg.Button('Save'), sg.Button('Auto Fill'), sg.Button('Cancel')],
    ]
    window = sg.Window('Settings', layout, modal=True)
    while True:
        event, values = window.read()
        if event in (sg.WIN_CLOSED, 'Cancel'):
            flag = False
            break
        elif event == 'Save':
            settings['Name'] = values['Name']
            flag = True
            break
        elif event == 'Auto Fill':
            window['Test'].update(values['Name'])
    window.close()
    return flag

def main_window():
    sg.theme('DarkBlue3')
    name = settings['Name']
    value = name if name else 'None'
    layout = [
        [sg.Text("User Name:"), sg.Text(value, key='Name')],
        [sg.Button('Settings'), sg.Button('Exit')],
    ]
    return sg.Window('Main', layout)

settings = {'Name':None}
window = main_window()
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Exit'):
        break
    elif event == 'Settings':
        flag = popup()
        if flag:
            window.close()
            window = main_window()
            """ or just update element
            name = settings['Name']
            value = name if name else 'None'
            window['Name'].update(value)
            """
window.close()