`from tkinter import *
pencere = Tk()
ba?l?k = pencere.title("deneme2")
etiket = Label(text="")
etiket.pack()
def g?ster(event):
etiket["text"] = "%s se?ildi."%liste.get(ACTIVE)
etiket.pack()
liste = Listbox()
liste.insert(1, "?stanbul")
liste.insert(2, "Ankara")
liste.insert(3, "?zmir")
liste.insert(4, "?zmit")
liste.insert(5, "Antalya")
liste.insert(6, "Bursa")
liste.pack()
liste.bind("<Button-1>",g?ster)
mainloop()`
這就是問題所在! 我參加了一個在線課程,但無法弄清楚為什么它會顯示錯誤的文本。我選擇?zmir 它說?stanbul,我選擇Ankara 它說?stanbul,我選擇?stanbul 它說Ankara,其他的也是這樣。
uj5u.com熱心網友回復:
您的代碼正在運行。只需雙擊它。您不需要etiket.pack()在g?ster函式內部。我不得不重新排列我們的代碼以使其更具可讀性。只需雙擊它。我還為Label和添加了小部件Listbox。
from tkinter import *
pencere = Tk()
ba?l?k = pencere.title("deneme2")
def g?ster(event):
etiket.config(text = "%s se?ildi."%liste.get(ACTIVE))
etiket = Label(pencere)
etiket.pack()
liste = Listbox(pencere)
liste.insert(0, "?stanbul")
liste.insert(1, "Ankara")
liste.insert(2, "?zmir")
liste.insert(3, "?zmit")
liste.insert(4, "Antalya")
liste.insert(5, "Bursa")
liste.pack()
etiket.pack()
liste.bind("<Button-1>",g?ster)
mainloop()
uj5u.com熱心網友回復:
讓我們首先關注問題
為什么串列框不回應僅單擊選定的專案,而是最后單擊的專案?
要更改串列框中選定的專案,您必須單擊該專案。在 tkinter 的事件驅動機制中,串列框將被“通知”滑鼠單擊并對其更改其值做出“反應”。
當您通過將滑鼠單擊系結到您的函式來捕獲滑鼠單擊時,該函式將在串列框接收到滑鼠單擊之前得到通知。串列框在單擊時確實“不知道”它將成為下一個單擊,因為單擊首先由您的函式處理并且僅在傳遞到串列框之后。
因此,在函式中詢問其當前選定值的“差”串列框會以最后一次單擊的方式回應,并且從串列框的角度來看也是當前值。
在第一次單擊時,如果使用串列框詢問尚未選擇任何專案,則使用ACTIVE其第一個值進行回應,如果詢問,listbox.curselection()則根本不回傳任何值。
檢查串列框的listbox.get(ACTIVE)狀態與檢查其狀態的行為不同,listbox.get(listbox.curselection())后者按照直覺預期做出回應。
請注意,上面的解釋是簡化的,在事件驅動的編程環境中事情通常并不簡單,但簡單的解釋有助于理解以正確方式做事的重要性,以盡量減少有時出錯的機會。
您提供的代碼同時存在兩個問題,您必須同時解決這兩個問題才能獲得預期的結果。
第一個問題是您系結<Button-1>(即滑鼠單擊)而不是捕獲事件,第二個問題是您應該使用而不是<<ListboxSelect>>向串列框詢問其當前選定的專案。listbox.get(listbox.curselection())listbox.get(ACTIVE)
下面的代碼演示了所有四種情況,表明只有一種情況可以按預期進行。讓我們用一個簡單的陳述來總結上面所說的所有內容:
您應該將<<ListboxSelect>>事件用于系結和listbox.get(listbox.curselection())串列框中所選專案的值。
from tkinter import *
list_CASE = ['']
list_CASE.append("<Button-1>(Mouse Click), liste.get(ACTIVE)")
list_CASE.append("<Button-1>(Mouse Click), liste.get(liste.curselection())")
list_CASE.append("<<ListboxSelect>>, liste.get(ACTIVE)")
list_CASE.append("<<ListboxSelect>>, liste.get(liste.curselection())")
def g?ster(event):
# global indx, etiket, liste
if indx in [1,3]:
etiket["text"] = "%s se?ildi."%liste.get(ACTIVE)
if indx in [2,4]:
etiket["text"] = "%s se?ildi."%liste.get(liste.curselection())
for indx, CASE in enumerate(list_CASE):
if indx == 0 : continue
pencere = Tk()
pencere.geometry('700x400 300 300')
pencere.title(CASE)
# ba?l?k = pencere.title("deneme2")
etiket = Label(text="", font=(16)); etiket.pack()
liste = Listbox(selectmode='browse', font=(16))
liste.insert(1, "?stanbul")
liste.insert(2, "Ankara")
liste.insert(3, "?zmir")
liste.insert(4, "?zmit")
liste.insert(5, "Antalya")
liste.insert(6, "Bursa")
liste.pack()
if indx in [1,2]: liste.bind("<Button-1>" , g?ster)
if indx in [3,4]: liste.bind("<<ListboxSelect>>", g?ster)
mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497228.html
