python: Skicka event till annan klass?

Permalänk
Medlem

python: Skicka event till annan klass?

Min kod, jag vill ha en helt vanlig bind, men då MultiListbox är inkomplett vet jag inte hur det skall göras

from Tkinter import * from MultiListbox import * import sys, codecs, tkMessageBox, re class GUI(object): def __init__(self): self.root = Tk() self.output_Frame = Frame(self.root) self.search_results.bind("<Button-3>", self.popup) self.menu = Menu(self.root, tearoff=0) self.menu.add_command(label="bla", command="") self.menu.add_command(label="blabla", command="") self.menu.add_separator() self.menu.add_command(label="Exit", command=self.root.quit) self.output_Frame.pack(fill=BOTH, expand=YES) self.root.mainloop() def popup(self, event): print event self.search_results.selection_clear(0, END) self.search_results.selection_set(self.search_results.nearest(event.y)) self.menu.post(event.x_root, event.y_root)

MultiListbox

from Tkinter import * class MultiListbox(Frame): def __init__(self, master, lists): Frame.__init__(self, master) self.lists = [] for l,w in lists: frame = Frame(self); frame.pack(side=LEFT, expand=YES, fill=BOTH) Label(frame, text=l, borderwidth=1, relief=RAISED).pack(fill=X) lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0, relief=FLAT, exportselection=FALSE) lb.pack(expand=YES, fill=BOTH) self.lists.append(lb) lb.bind('<B1-Motion>', lambda e, s=self: s._select(e.y)) lb.bind('<Button-1>', lambda e, s=self: s._select(e.y)) lb.bind('<Leave>', lambda e: 'break') lb.bind('<B2-Motion>', lambda e, s=self: s._b2motion(e.x, e.y)) #lb.bind('<Button-2>', lambda e, s=self: s._button2(e.x, e.y)) #lb.bind('<Button-3>', lambda e, s=self: s._popup(e)) frame = Frame(self); frame.pack(side=LEFT, fill=Y) Label(frame, borderwidth=1, relief=RAISED).pack(fill=X) sb = Scrollbar(frame, orient=VERTICAL, command=self._scroll) sb.pack(expand=YES, fill=Y) self.lists[0]['yscrollcommand']=sb.set def _popup(self, e): print e.y #row = self.lists[0].nearest(e) #self.selection_clear(0, END) #self.selection_set(row) #GUI.popup(e) return 'break' #return e.y def _select(self, y): row = self.lists[0].nearest(y) self.selection_clear(0, END) self.selection_set(row) return 'break' def _bbind(self, event): print event def _button2(self, x, y): for l in self.lists: l.scan_mark(x, y) return 'break' def _b2motion(self, x, y): for l in self.lists: l.scan_dragto(x, y) return 'break' def _scroll(self, *args): for l in self.lists: apply(l.yview, args) def curselection(self): return self.lists[0].curselection() def delete(self, first, last=None): for l in self.lists: l.delete(first, last) def get(self, first, last=None): result = [] for l in self.lists: result.append(l.get(first,last)) if last: return apply(map, [None] + result) return result def index(self, index): self.lists[0].index(index) def insert(self, index, *elements): for e in elements: i = 0 for l in self.lists: l.insert(index, e[i]) i = i + 1 def size(self): return self.lists[0].size() def see(self, index): for l in self.lists: l.see(index) def selection_anchor(self, index): for l in self.lists: l.selection_anchor(index) def selection_clear(self, first, last=None): for l in self.lists: l.selection_clear(first, last) def selection_includes(self, index): return self.lists[0].selection_includes(index) def selection_set(self, first, last=None): for l in self.lists: l.selection_set(first, last) if __name__ == '__main__': tk = Tk() Label(tk, text='MultiListbox').pack() mlb = MultiListbox(tk, (('Subject', 40), ('Sender', 20), ('Date', 10))) for i in range(1000): mlb.insert(END, ('Important Message: %d' % i, 'John Doe', '10/10/%04d' % (1900+i))) mlb.pack(expand=YES,fill=BOTH) tk.mainloop()

Jag vill alltså binda högerklick i search_results för att få upp en meny, jag vet inte hur jag ska göra det då det antagligen skall göras i multilistbox och jag förstår inte hur jag "skickar tillbaka" eventet till huvudklassen. Tips?

Visa signatur

Citera om du vill ha svar.