簡體   English   中英

取消選擇pysimplegui列表框上的項目重新單擊

[英]Unselect item on pysimplegui listbox re-click

我最近開始在一個基本的 GUI 應用程序上使用 pysimplegui。 我的 window 有一個 ListBox 初始化如下:

sg.Listbox(values=[], select_mode="extended", key="list_box", size=(40, 25), enable_events=True)

它工作得很好,一切都很好,但是在我 select 列表中的一個項目之后,我無法取消選擇它。 我試圖清除這樣的選擇

window["list_box"].update(set_to_index=[])

它工作正常,但對我來說感覺不對,因為我必須為每個ListBox保留一個 state 關於最后選擇的項目,以了解何時進行新選擇或只是重新選擇前一個項目。

底線,我想在兩次單擊同一項目時清除ListBox的選擇。

希望我清楚,謝謝

參考http://www.tcl-lang.org/man/tcl8.6/TkCmd/listbox.htm#DEFAULT:~:text=elements%20become%20visible.-,DEFAULT%20BINDINGS,-Tk%20automatically%20creates

在擴展模式下,按住 Control 鍵的同時按下按鈕 1 可啟動切換操作。

無論如何,你可以這樣做

import PySimpleGUI as sg

data = [f'Item {i+1:0>2d}' for i in range(10)]

layout = [
    [sg.Listbox(
        values=data,
        select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED,
        size=(20, 5),
        enable_events=True,
        key="-LISTBOX-",
        metadata=[],
    )],
]
window = sg.Window('Listbox', layout, finalize=True)
listbox = window["-LISTBOX-"]

while True:

    event, values = window.read()

    if event == sg.WINDOW_CLOSED:
        break
    print(event, values)
    if event == "-LISTBOX-":
        metadata = listbox.metadata
        selections = values["-LISTBOX-"]
        print(metadata, selections)
        if metadata == selections:
            listbox.update(set_to_index=[])
            listbox.metadata = []
        else:
            listbox.metadata = values["-LISTBOX-"]

window.close()

注意:有一個問題,你不能快速點擊同一個項目到 select 它,否則下次點擊不會產生任何事件。 這不是 PySimpleGUI 或您的代碼的問題,可能默認為Tk ,它會自動為列表框創建 class 綁定,從而賦予它們類似 Motif 的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM