2013-04-01 32 views
7

Tôi đang làm việc trên một dự án trong python và tôi đã thực hiện một phương pháp để vẽ một điều cụ thể trong tkinter. Tôi muốn nó để bất cứ khi nào tôi nhấn phím cách, hình ảnh sẽ vẽ lại chính nó (chạy lại phương thức vì tôi đã mã hóa phương thức để nó có thể vẽ lại chính nó). Làm thế nào chính xác tôi sẽ ràng buộc phím cách để phương pháp để chương trình sẽ chạy, vẽ, và vẽ lại nếu tôi nhấn phím dài?Cách liên kết khóa phím cách với một phương thức nhất định trong tkinter (python)

ví dụ, tôi muốn nó để bất cứ khi nào tôi nhấn không gian, chương trình thu hút ở một vị trí ngẫu nhiên trên vải:

from Tkinter import * 
from random import * 

root=Tk() 
canvas=Canvas(root,width=400,height=300,bg='white') 
def draw(): 
    canvas.delete(ALL)# clear canvas first 
    canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red') 
draw() 
canvas.pack() 
root.mainloop() 

làm thế nào tôi sẽ ràng buộc các spacebar để phương pháp này?

Trả lời

9
from Tkinter import * 
from random import * 

root=Tk() 
canvas=Canvas(root,width=400,height=300,bg='white') 
def draw(event=None): 
    canvas.delete(ALL)# clear canvas first 
    canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red') 
draw() 
canvas.pack() 

root.bind("<space>", draw) 
root.mainloop() 
+0

cảm ơn bạn rất nhiều! Tôi đã xem xét các câu hỏi khác nhưng không thể tìm thấy một cái gì đó tương tự như những gì tôi cần. Tôi đoán thêm sự kiện = Không có gì quan trọng. –

+0

vui lòng trợ giúp. vâng, chức năng gọi lại được gọi bởi Tkinter với một tham số, vì vậy nó cần cái gì đó được truyền vào. Và bằng cách đặt nó thành None bạn có thể gọi nó trong dòng 9 mà không truyền bất cứ thứ gì vào. – twasbrillig

1

Bạn có thể làm một cái gì đó như thế này:

from Tkinter import * 
from random import * 

root=Tk() 
canvas=Canvas(root,width=400,height=300,bg='white') 

def draw(event): 
    if event.char == ' ': 
     canvas.delete(ALL)# clear canvas first 
     canvas.create_oval(randint(0,399),randint(0,299),15,15,fill='red') 

root.bind('<Key>', draw) 

canvas.pack() 
root.mainloop() 

Về cơ bản, bạn có ràng buộc chức năng vẽ của bạn đối với một số yếu tố cấp cao nhất đến <Key> ràng buộc mà được kích hoạt bất cứ khi nào một phím trên bàn phím được nhấn. Sau đó, đối tượng sự kiện được truyền vào có thành viên char chứa một chuỗi biểu thị khóa đã được nhấn trên bàn phím.

Sự kiện sẽ chỉ được kích hoạt khi đối tượng bị ràng buộc có tiêu điểm, đó là lý do tại sao tôi ràng buộc phương pháp draw đối tượng root, vì đối tượng đó sẽ luôn được lấy nét.

+0

tại sao bạn chọn liên kết ' 'thay vì' '? Có vẻ như bạn đang tạo ra nhiều việc hơn cho chính mình –

+0

@BryanOakley Vâng, tôi đã không nhận ra rằng '' tồn tại cho đến sau khi tôi nhìn thấy câu trả lời khác. Tôi để lại câu trả lời của tôi trong trường hợp nó hữu ích, nhưng tôi đã upvoted câu trả lời khác. – Michael0x2a

0

Bạn tôi cũng có thể sử dụng canvas.bind_all("<space>", yourFunction) Đó sẽ lắng nghe các sự kiện trong toàn bộ ứng dụng và không chỉ trên widget.

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