hide_row() 在 pysimplegui 中只工作一次?

hide_row() in pysimplegui work only one time?

我在我的代码中使用 hide_row() 元素或功能来隐藏行,但当我连接到 Retreat 按钮或 Retreat 键时它只工作一次,当我再次单击或在第二次单击时它不起作用工作(查看代码或尝试理解我的意思)如何让它不仅一次连续工作,还是有另一种方法来撤消或删除部分或行。

import PySimpleGUI as sg

layout = [

[sg.Col([[sg.T('Enter your name:'),sg.In()],[sg.Btn('Ok'), sg.Btn('Exit'),
sg.Btn('Add new row')]],k='col_key')]

]

window = sg.Window('Test', layout)

while True:
    event, values = window.read()
    if event in ('Exit' ,sg.WIN_CLOSED):
        break

    if event == ('Add new row'):
        window.extend_layout(window['col_key'],[[sg.T('Enter your name:', key='new_raw'),(sg.In())]])
        window.extend_layout(window['col_key'],[[sg.Btn('Retreat', key='re')]])

    if event == ('re'):
        window['new_raw'].hide_row()
        window['re'].hide_row()

window.close()

由于再次添加新行时新元素有重复键造成的,所以调用window[new_key]时总是会找到第一个元素。

创建新元素时应为不同的元素使用不同的键。

新元素的键将被替换为

element.Key = str(element.Key) + str(self.UniqueKeyCounter)

所以新元素的关键是

'new_raw', 're', 'new_raw0', 're1', 'new_raw2', 're3',  'new_raw4', 're5', ...

您可以通过

查看
>>> window.key_dict
{
...
 'new_raw': <PySimpleGUI.PySimpleGUI.Text object at 0x000001D3A5B80FA0>,
 'new_raw0': <PySimpleGUI.PySimpleGUI.Text object at 0x000001D3A6FA1280>,
 'new_raw2': <PySimpleGUI.PySimpleGUI.Text object at 0x000001D3A6FA1220>,
 're': <PySimpleGUI.PySimpleGUI.Button object at 0x000001D3A6FA1CD0>,
 're1': <PySimpleGUI.PySimpleGUI.Button object at 0x000001D3A6FA1340>,
 're3': <PySimpleGUI.PySimpleGUI.Button object at 0x000001D3A6FA11F0>}

生成新行后,按钮Retreat的键不是're',而是以're'开始,以索引结束。

更新代码如下

import PySimpleGUI as sg

layout = [

[sg.Col([[sg.T('Enter your name:'),sg.In()],[sg.Btn('Ok'), sg.Btn('Exit'),
sg.Btn('Add new row')]],k='col_key')]

]

window = sg.Window('Test', layout)
index = 0
while True:
    event, values = window.read()
    if event in ('Exit' ,sg.WIN_CLOSED):
        break

    if event == ('Add new row'):
        window.extend_layout(window['col_key'],[[sg.T('Enter your name:', key=f'new_raw {index}'),(sg.In(key=f'input {index}'))]])
        window.extend_layout(window['col_key'],[[sg.Btn('Retreat', key=f're {index}')]])
        index += 1

    if event.startswith('re'):
        i = event.split(' ')[-1]
        window[f'new_raw {i}'].hide_row()
        window[f're {i}'].hide_row()

window.close()

还是有问题,因为隐藏的旧行仍然会保留在内存中,所以如果你一次又一次地添加新行,占用的内存会越来越高,但这里不讨论这个问题。