无法从 GtkDialog 中 GtkListBox 的单击事件中更新 GtkIconView

Can't update GtkIconView from within a click event on a GtkListBox in a GtkDialog

这是对话框代码中列表框的点击事件当前的样子。

def OnSelectCategory(self, listbox, data=None):

try:  
    # Get the text of the selected category.
    selected = listbox.get_selected_row()    
    label = selected.get_child()  
    itemText = label.get_text() 
            
    # Get the tags for the selected category.
    tagtext = self.categoryTags.get(itemText)            

    self.updateStatusbar("Collecting videos...")

    # Start a thread to scan for videos.
    self.threadEvent = threading.Event()
    self.videoscanThread = threading.Thread(target=self.ScanForVideos, args=(self.threadEvent, tagtext,))
    self.videoscanThread.daemon = True
    self.videoscanThread.start()

    self.threadEvent.set()

except Exception as e:
    print("Exception from 'OnSelectCategory':", str(e))

起初,我无法让状态栏立即更新文本。我本来调用函数直接更新文本。在 ScanForVideos 函数完成之前,状态栏文本不会更新。因此,我将 ScanForVideos 代码移到了一个线程中。线程等待事件开始。

线程 (ScanForVideos) 运行几个 'for' 循环寻找匹配条件。找到条件后,代码将附加到 IconView 的列表存储。在线程函数的末尾,代码将 IconView 模型设置为列表存储。 IconView 似乎更新了一些项目,但并不是所有应该存在的项目。此外,代码似乎是 'hung' 因为我无法关闭包含 IconView 的对话框。我必须在 Visual Studio 代码中停止调试。

我觉得我在 Python 编码中违反了一些我没有意识到的事情。或者,我更新 IconView 的设计不正确。任何人都可以阐明我可能做错了什么吗?

我意识到我正试图从我的后台线程中更新一些 UI 小部件。然后我偶然发现了 GLib.idle_add。我写了一个单独的函数来更新 UI 小部件并调用 idle_add 传递函数的名称。这允许我从后台线程更新 GUI。