【问题标题】:How to empty out Listbox in PySimpleGUI如何在 PySimpleGUI 中清空列表框
【发布时间】:2020-11-24 21:40:30
【问题描述】:

我是 PySimpleGUI 的新手,但事实证明它确实像宣传的那样简单。仅仅几个小时后,我就有了一个半途而废的应用程序。

我正在使用列表框来显示从磁盘文件中读取的几行项目。当我点击我的 Show Connections 按钮时,它会读取文件并显示我想要的项目。但是如果我再次单击该按钮,它会再次读取文件,现在我在框中有两个副本。我想在从下一个读取的磁盘文件更新列表框之前清空列表框,以便它始终准确显示文件中的内容。我已经尝试过 Updateset_value 但似乎没有任何效果。

layout_showdata = [
    [
    sg.Text('Time',size=(10,1)),
    sg.Text('Destination',size=(14,1)),
    sg.Text('Source',size=(14,1))],
    [sg.Listbox(size=(38,10),values=[''],key='_display_')]
]

。 . .

    if event == 'Show Connections':
        print('Show Connections')
        window['panel_show'].update(visible=True)
        window['panel_edit'].update(visible=False)
        window['panel_entry'].update(visible=False)
        window['_display_'].set_value([])      ***#<==This should do it I thought***
        with open('connections.txt','r') as cfile:
            schedule=csv.reader(cfile,dialect="pipes")
            for row in schedule:
                items.append(row[0]+':'+row[1]+':'+row[2]+' '+row[3]+'   '+row[4])
                print(items[itemnum])
                itemnum+=1
            window.FindElement('_display_').Update(items)

我确定我遗漏了一些简单的东西,如果我能得到任何帮助,我将不胜感激。

[编辑] 添加了一些运行代码来说明会发生什么。按下按钮时不会清除列表框,它只是再次读取文件并添加到已经存在的文件中:

import PySimpleGUI as sg
import csv
items = []
itemnum = 0
csv.register_dialect('pipes', delimiter='|')

file = [
'01|23|45|12345678|87654321',
'04|35|23|24680864|08642468',
'01|23|45|12345678|87654321',
'04|35|23|24680864|08642468',
'01|23|45|12345678|87654321',
'23|23|23|12341234|43214321'
]


layout_showdata = [
        [
        sg.Text('Time',size=(10,1)),
        sg.Text('Destination',size=(14,1)),
        sg.Text('Source',size=(14,1))],
        [sg.Listbox(size=(38,10),values=[''],key='_display_')],
        [sg.Button('Show Connections')]
    ]
window = sg.Window('XY Scheduler', layout_showdata)

while True:
    event, values = window.Read(timeout=1)
    if event in (None, 'Quit'):
        break

#Show Existing Connections
    
    if event == 'Show Connections':
        print('Show Connections')
        window['_display_'].update([])
        schedule=csv.reader(file,dialect="pipes")
        for row in schedule:
            items.append(row[0]+':'+row[1]+':'+row[2]+'         '+row[3]+'              '+row[4])
            print(items[itemnum])
            itemnum+=1
        window.FindElement('_display_').Update(items)

【问题讨论】:

    标签: python listbox pysimplegui


    【解决方案1】:

    如果要更改值,则需要更新方法。你会发现它有一个 values 参数。调用参考文档或文档字符串会对您有很大帮助,但使用的一般经验法则是 update 是更改元素某些内容的方法。

    您已经为其他元素调用了它。您只需为列表框调用它即可。

    window['_display_'].update([]) 
    

    set_values 调用在文档中有这样的描述: "设置列表框突出显示的选项"

    它设置已选择的内容,而不是您必须选择的选项。

    [编辑] 这是一个完整示例,说明如何删除列表框中的所有条目。也许我误解了这个问题。

    import PySimpleGUI as sg
    
    def main():
        layout = [  [sg.Text('My Window')],
                    [sg.Listbox([1,2,3,4,5], size=(5,3), k='-LB-')],
                    [sg.Button('Go'), sg.Button('Exit')]  ]
    
        window = sg.Window('Window Title', layout)
    
        while True:             # Event Loop
            event, values = window.read()
            print(event, values)
            if event == sg.WIN_CLOSED or event == 'Exit':
                break
            if event == 'Go':
                window['-LB-'].update([])
        window.close()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • 发布问题后,我意识到 set_values 是错误的。但是我已经尝试过使用更新,但它没有用。只是再次尝试确定并且行为是相同的。它似乎忽略了更新,只是重新加载文件中的行并将它们添加到列表框中已经存在的行中。在原始帖子中添加了一些代码来说明。感谢@MikeyB 和其他可以提供帮助的人。
    • 打印您传递的内容以进行更新,以确保您发送的内容是您认为的内容。为您添加了一个完整的示例。如果将 [] 更改为列表 [4,5,6],您将看到列表框更改为这些值。我认为这不是 PySimpleGUI 问题。
    • 查看代码中的逻辑。您在事件循环内对items 执行的唯一操作是items.append。您的列表框将新内容添加到列表框中已经存在的软管的原因是因为您的代码正在执行此操作。这不是 PySimpleGUI 问题……这是代码中的逻辑问题。打印您传递给update 方法的items,您会看到您传递了错误信息。 ??‍♂️
    • 是的,就是这样。我知道这很愚蠢。我非常关注 PySimpleGUI 是问题所在,却错过了自己的错误。谢谢!
    • 是否愿意将答案标记为正确,以便下一个人看到?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多