簡體   English   中英

是否可以更改 Tk/Tkinter 列表框小部件的綁定順序 &lt;<listboxselect> &gt; 活動</listboxselect>

[英]Is it possible to alter binding order of a Tk/Tkinter Listbox widget <<ListboxSelect>> event

據我了解,Tk/Tkinter Listbox 小部件的“正常”綁定事件順序是(簡化): <ButtonPress>, <<ListboxSelect>>, <ButtonRelease>

是否可以“更改”順序以便在<ButtonRelease>之后觸發<<ListboxSelect>>事件?

為此,我嘗試將bindtags與自定義的“假” bind_class一起使用,但到目前為止還沒有得到想要的結果……這是代碼示例:

import tkinter as tk

root = tk.Tk()

l = tk.Listbox(root, name='custlist')
for e in range(55): l.insert(tk.END, 'L_item'+str(e))
l.pack()

l.bind('<ButtonPress>', lambda e: print("L: Click"))
l.bind('<ButtonRelease>', lambda e: print("L: ButtonRelease"))

l.bind_class("post-class-bindings", "<<ListboxSelect>>", lambda e: print("L: post-ListboxSelect"))
l.bindtags((l.winfo_pathname(l.winfo_id()),'Listbox','post-class-bindings', '.', 'all'))

你能告訴我是否有可能以這種或另一種方式獲得這樣的東西? 謝謝

編輯:

想到它,我意識到我不能那樣做,因為我猜<ButtonPress>+<<ListboxSelect>>事件在它們的流程中有些“鏈接”,而<ButtonRelease>是“未綁定”的,所以我應該調用/在<ButtonRelease>回調結束時生成<<ListboxSelect>>事件以觸發它......這可能在大多數情況下都有效,但是......這不是我想要達到的......(確實,這就像將<<ListboxSelect>>事件代碼“移動”到<ButtonRelease> callbak...)所以,最后,問題是是否可以將 ButtonRelease 與 ListboxSelect 一起“鏈接”(在和 ButtonPress 一樣)? ...我想這樣的事情是不可能的

是否可以“更改”順序以便在該順序之后觸發<<ListboxSelect>>事件?

這樣做的唯一方法是防止在單擊按鈕時更改選擇。 <<ListboxSelect>>不是按鈕單擊或按鈕釋放的直接結果,而是選擇已更改的直接結果。 您不能在單擊時更改選擇,也不能生成<<ListboxSelect>>

我不太明白您的真正需求是什么,但是如果您想在按鈕釋放時收到選擇更改的通知,您總是可以在<ButtonRelease-1>的處理程序中發出您自己的自定義虛擬事件,例如, <<ListboxSelectAfterClick>> .

感謝 Bryan Oakley 的澄清,我為此找到了一個可能的解決方案:

我的主要意圖是讓列表中的元素選擇僅在釋放鼠標按鈕后激活/觸發。

import tkinter as tk

root = tk.Tk()

l = tk.Listbox(temp, name='custlist', selectmode='single')
for e in range(55): l.insert(tk.END, 'L_item'+str(e))
l.pack()

l.bind('<ButtonPress>', lambda e: "break")
def AfterReleaseSelect(event):
    event.widget.selection_clear(0,tk.END)
    event.widget.selection_set(event.widget.nearest(event.y))
    #more stuffs here if needed...
l.bind('<ButtonRelease>', AfterReleaseSelect)

實際上,我在這里所做的是阻止按鈕單擊以完成其工作,以便不會觸發列表框選擇,然后等待釋放鼠標按鈕來執行此操作。

對此的一些最終想法:

首先,請注意:我在這里向 Listbox 小部件添加了selectmode='single'參數,因為我認為在處理默認(“ 'browse' -select”)列表框時應用這種方法是不值得的。 這是因為,與“'browse'-select”列表框不同,使用“ 'single' single'-select”列表框元素選擇不會“跟隨”鼠標直到最后,它會在第一次點擊時“卡住”-元素,即使您結束在不同項目上釋放鼠標按鈕。

我必須說,無論如何,這可能在大多數情況下都不值得,因為你可能只是:

  • 避免使用selectmode='single'參數,保留默認列表框'browse' -select-behavior;
  • 將您使用綁定<<ListboxSelect>>執行的代碼“移動”到<ButtonRelease>上的綁定(當然,這不會涉及代碼的 rest 上的太多“扭曲”......)

暫無
暫無

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

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