2017-07-21 2 views
0

Ich habe ein Listenfeld Ich möchte nur ein Element auswählen, wenn ich darauf doppelklicke, und den Mehrfachauswahlmodus verwenden, wenn Elemente mit einem einzigen Mausklick angezeigt werden. Ist das möglich?tkinter selectmode single und multiple Verhalten für Listbox

Der folgende Code tut nicht ganz das, was ich möchte, da er Einzelklick-Ereignisse aufruft, wenn Doppelklick-Ereignisse aufgerufen werden. Ich würde am liebsten zwischen beiden wählen.

from tkinter import * 

class Message: 
    def __init__(self, root): 
     self.list_item = StringVar() 
     self.listBoxObj = Listbox(root, listvariable=self.list_item, selectmode='multiple') 
     listItems = ['Jane', 'Kate', 'Dani'] 
     self.listBoxObj.pack() 
     self.listBoxObj.bind('<Double-Button-1>', self.on_double_click) 
     self.listBoxObj.bind('<ButtonRelease-1>', self.on_single_click) 
     for item in listItems: 
      self.listBoxObj.insert(END, item) 

    def on_double_click(self, event): 
     widget = event.widget 
     selection = widget.curselection() 
     value = widget.get(selection[0]) 
     popup = Tk() 
     popup.geometry('300x200') 
     listBox2 = Listbox(popup) 
     listBox2.insert(END, str(value)) 
     listBox2.pack() 
     popup.mainloop() 

    def on_single_click(self,event): 
     print('do something different here') 

if __name__ == '__main__': 
    root = Tk() 
    cMessageObj = Message(root) 
    root.mainloop() 

Antwort

1

Tkinter wird immer sowohl einen einzigen Klick und ein Doppel-Klick-Ereignis senden, wenn der Benutzer doppelklickt. Stellen Sie sich das so vor: Wenn Sie einmal klicken, hat der Computer keine Ahnung, ob Sie ein zweites Mal klicken oder nicht, also sendet er das Einzelklick-Ereignis.

Wenn Sie ein zweites Mal klicken, vergleicht tkinter den Zeitstempel mit dem vorherigen Klickereignis und wenn er unter einem Schwellenwert liegt, wird ein Doppelklick registriert. An diesem Punkt ist es nicht möglich, das Einzelklickereignis aufzuheben.

Wenn Sie zwischen den beiden unterscheiden müssen, müssen Sie sie so einrichten, dass jede einzelne Aktion in der Zukunft kurzzeitig ausgeführt wird (über after). Wenn Sie einen Doppelklick erhalten, können Sie die Einzelklick-Aktion abbrechen.

Aus Gründen der Benutzerfreundlichkeit empfehle ich nicht, das zu tun. In den meisten Fällen sollte ein einzelner Klick immer etwas tun, und ein Doppelklick tut etwas zusätzlich auf den einzelnen Klick.

+0

Es sieht so aus, als ob es ziemlich einfach ist, die After-Funktion zu verwenden. Aber ich sehe nicht viele Informationen über die Absage von Ereignissen. Kannst du mich auf etwas hinweisen, das ich lesen kann, um mit der Veranstaltung fertig zu werden? – ProfessionalNameForDisplayHere

+0

@ProfessionalNameForDisplayHere: 'id = some_widget.after (...); ...; some_widget.after_cancel (id) ' –

Verwandte Themen