2013-01-23 26 views
5

Tôi có một số mã như thế nàyLàm thế nào tôi có thể ngừng tăng sự kiện trong Tkinter?

from Tkinter import * 
master = Tk() 
def oval_mouse_click(event): 
    print "in oval" 
def canvas_mouse_click(event): 
    print "in canvas" 
w = Canvas(master, width = 800, height = 600) 
uid = w.create_oval(390, 290, 410, 310, fill='blue') 
w.tag_bind(uid, "<Button-1>", lambda x: oval_mouse_click(x)) 
w.bind("<Button-1>" , canvas_mouse_click) 
w.pack() 
mainloop() 

Khi tôi bấm vào Canvas Tôi có "trong vải" thông điệp trong giao diện điều khiển. Khi tôi nhấp vào] trên Hình bầu dục, tôi có hai thông báo "trong hình bầu dục" và "trong canvas", nhưng tôi muốn chỉ có thông báo đầu tiên. Có cách nào để ngừng tăng sự kiện không?

Tôi có thể thực hiện tác vụ này với một số cờ toàn cầu nhưng tôi nghĩ rằng nên có cách tự nhiên hơn cho Tkl.

+1

Bạn đã tìm thấy cách dễ nhất, 'return 'break'' không hoạt động đối với liên kết thẻ canvas. – mmgp

+0

Liên quan: [Python tkinter: dừng tuyên truyền sự kiện trong thẻ tiện ích văn bản] (http://stackoverflow.com/questions/13066773/python-tkinter-stopping-event-propagation-in-text-widgets-tags/13076458) – phoibos

Trả lời

2

Dưới đây là ví dụ đơn giản nhất để giải quyết vấn đề của bạn:

import Tkinter 

def oval_mouse_click(event): 
    print "in oval" 
    event.widget.tag_click = True 

def canvas_mouse_click(event): 
    if event.widget.tag_click: 
     event.widget.tag_click = False 
     return 
    print "in canvas" 

root = Tkinter.Tk() 
canvas = Tkinter.Canvas(width=400, height=300) 
oid = canvas.create_oval(400/2-10, 300/2-10, 400/2+10, 300/2+10, fill='blue') 
canvas.tag_click = False 
canvas.tag_bind(oid, "<Button-1>", oval_mouse_click) 
canvas.bind("<Button-1>" , canvas_mouse_click) 
canvas.pack() 
root.mainloop() 

Không có cách nào khác dễ dàng hơn để xử lý này dưới Canvas.

0

Tôi vừa đăng một giải pháp cải tiến về vấn đề tương tự ở đó Python tkinter: stopping event propagation in text widgets tags.

Ý tưởng cốt lõi giống như được trình bày trong các giải pháp trước: cướp tiện ích Canvas bằng cách liên kết nó với cùng một chuỗi sự kiện là tag_bind. Các giải pháp cải tiến tôi đã đưa ra cho phép bây giờ để mô phỏng hành vi return "break" được mong đợi của các cặp liên kết + gọi lại khác của Tk. Nói tóm lại:

  1. tạo một wrapper quanh chúc callback, tức là một cá thể của lớp callable
  2. khi dụ lớp được gọi, chạy callback và kiểm tra kết quả của nó.
    • nếu kết quả là "break", tạm thời chiếm quyền điều khiển việc tuyên truyền sự kiện: bind các Canvas widget để cùng một sự kiện ràng buộc để tag_bind, với một callback rỗng. Sau đó, sau một thời gian nhàn rỗi, unbind.
    • nếu kết quả không phải là "break": không làm gì cả, sự kiện này sẽ tuyên truyền để Canvas tự động

Liên kết ở trên liệt kê một ví dụ làm việc đầy đủ với các phụ tùng Text, nhưng nó là ngay lập tức chuyển giao cho Canvas tiện ích.

Các vấn đề liên quan