2013-02-24 244 views
1

我想要做的是讓用戶點擊畫布上的某個地方,然後點擊其他地方,並在兩點之間畫一條直線。我是TKinter的新手,經過一些Google搜索和搜索後,我無法找到一個堅實的答案。Python tkinter畫布動態Create.Line

我一直在想它的方式,應該有一個onclick事件,它在畫布上傳遞鼠標座標,然後在畫布上傳遞這些座標的onrelease事件,從而在它們之間創建一條線。這條線必須是一個對象,我可以通過另一個按鈕在某個時候刪除,但這是一個單獨的問題。

任何幫助將不勝感激,甚至文章/教程的任何鏈接,也可以幫助

回答

5

你必須做的唯一的事情是結合"<Button-1>""<ButtonRelease-1>"到畫布:

from Tkinter import Tk, Canvas 

start = None 

def onclick_handler(event): 
    global start 
    start = (event.x, event.y) 

def onrelease_handler(event): 
    global start 
    if start is not None: 
     x = start[0] 
     y = start[1] 
     event.widget.create_line(x, y, event.x, event.y) 
     start = None 

master = Tk() 
canvas = Canvas(master, width=200, height=200) 
canvas.bind("<Button-1>", onclick_handler) 
canvas.bind("<ButtonRelease-1>", onrelease_handler) 
canvas.pack() 
master.mainloop() 

我不喜歡使用全局變量,它將所有小部件和相關函數封裝在一個類中更加清晰。但是,作爲一個例子,我認爲這是很清楚的。

+0

非常明確,謝謝! – user2103768 2013-02-26 15:54:52

+0

我把這個標記爲正確的答案,因爲我採取了這種方法,我只是將它包裝在課程中,我已經建立了,因此沒有全局變量 – user2103768 2013-02-27 15:16:11

1

看起來很漂亮,對我來說是明智之舉。

這裏只是檢查畫布的文檔: http://effbot.org/tkinterbook/canvas.htm

而且這裏的事件: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

而且他們,只需鍵入像這樣的代碼 - 類甚至比一個sinple更復雜你好世界 - 兩個全局變量會做簡單的代碼:

from Tkinter import Canvas, Tk, mainloop 
w = Tk() 
c = Canvas(w) 
c.pack() 

class DrawLines(object): 
    def __init__(self, canvas): 
     self.canvas = canvas 
     self.start_coords = None 
     self.end_coords = None 
    def __call__(self, event): 
     coords = event.x, event.y 
     if not self.start_coords: 
      self.start_coords = coords 
      return 
     self.end_coords = coords 
     self.canvas.create_line(self.start_coords[0], 
           self.start_coords[1], 
           self.end_coords[0], 
           self.end_coords[1]) 
     self.start_coords = self.end_coords 

c.bind("<Button-1>", DrawLines(c)) 

mainloop() 
+0

這兩個答案都非常有幫助,但這更接近我如何設置我的程序。感謝您的鏈接! – user2103768 2013-02-26 15:54:35