2015-02-05 34 views
-1

我已經通過綁定一鍵我的畫布綁定按鍵事件:在畫布組件

self.canvas.bind("<w>", lambda event: self.canvas.focus_set()) 

現在,我該怎麼辦,所以當按下此鍵,它會調用特定的動作,如將對象向上移動到畫布上?

+2

這個問題不值得一降投票,除了由所做的一點努力OP自己找到一個答案,但我完全理解,因爲tkinter的文檔,字面上,在我看來,很爛。 – nbro 2015-02-05 15:23:38

+1

@Rinzler:我不同意。 downvote按鈕有一個字面上以「這個問題沒有顯示任何研究工作」開頭的工具提示。對我而言,那意味着沒有研究成果的問題應該被降低。這個問題提出了無數教程和問題中記載的內容。此外,問題還不清楚:他們是在問如何調用函數,還是在問如何移動對象? – 2015-02-05 17:03:25

+1

@BryanOakley我理解你的觀點,但我不是一個機器人,我可以試着理解你在問什麼。他是這個網站的新手,我很確定他下一次他會改善他的問題。如果記錄這些事情,有時很難找到它們,實際上,大多數情況下,如果你是初學者。沒有官方更新的文檔。只有一半產生了不夠的支持。在我看來,Tkinter文檔很糟糕。 – nbro 2015-02-05 20:06:09

回答

0

你可以做到這一點我指定新座標每當你點擊例如字母W

Here您可以找到canvas對象支持的方法。有一個叫coords,它允許你通過它的ID指定一個對象的座標。該ID是當你創建一個對象,例如,當您創建一個oval返回值,:

oval_id = canvas.create_oval(x1, y1, x2, y2) 

ID都是唯一的,所以你可以用它們來移動特別是一個對象。 你可以用例如bind_all某個字母的點擊(例如w)和一個方法來移動我們的橢圓。下面是一個完整的工作示例(我討厭使用global,但在這種情況下,我使用它爲簡單起見):

try: 
    import tkinter as tk # using Python 3 
except ImportError: 
    import Tkinter as tk # using Python 2 

def move(event=None): 
    global x1, x2, y1, y2, oval 
    if event.char == 'w': 
     y1 -= 10 
     y2 -= 10 
     oval = (x1, y1, x2, y2) 
     canvas.coords(oval_id, oval) 

m = tk.Tk() 

canvas = tk.Canvas(m) 
canvas.pack(expand=1, fill='both') 
x1, x2 = 50, 100 
y1, y2 = 50, 100 
oval = (x1, y1, x2, y2) 
oval_id = canvas.create_oval(oval) 
canvas.bind_all('<w>', move) 

m.mainloop() 
1

根據您需要以下文件:

  1. 如果您還沒有這樣做的話,指定要作爲模式綁定在第一個參數self.canvas.bind鍵() 。
  2. 第二個參數可以是lambda表達式,函數或類方法。

例子:

# Sample event handler 
def handle_up_key(self, event): 
    self.canvas.focus_set() 
    # Do whatever else you want. 

def __init__(self): 
    self.canvas.bind("<Key-Up>", self.handle_up_key) 
    self.canvas.bind("<KeyPress-Up>", ...) 
    self.canvas.bind("<KeyRelease-Up>", ...) 
    # And so for any key you want to map. 

更多信息:

+1

您可能想要提到的是,畫布還需要有鍵盤焦點才能讓它首先被賦予事件。 – 2015-02-05 17:04:50