2016-11-15 104 views
2

我在一個Python應用程序中使用Tkinter的工作。我想要做的是繪製畫布座標,並將這些點記錄到列表中,以便稍後進行計算。 如果這是不可能的,你會建議任何其他工具或GUI的平臺,可以做到這一點?使用鼠標在python tkinter畫布上繪製並獲取點到列表?

編輯:我有什麼到目前爲止,可以從列表中取分,並在畫布上繪製的應用程序。我希望有相反的工作方式。

from tkinter import * 
from tkinter.filedialog import askopenfilename 
from tkinter.messagebox import showerror 
from tkinter import ttk 
import tkinter 
import threading 

another_points = [] 

class Waveform(Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 
     self.master = master 

     self.points = [10, 20, 30] 
     self.create_widget() 

    def create_widget(self): 

     self.LoadFrame = ttk.LabelFrame(self.master, text = "Load") 
     self.LoadFrame.pack(side = "left", padx = 10, pady = 10) 
     self.PlotFrame() 

     self.anotherFrame = ttk.LabelFrame(self.LoadFrame, text = "Browse") 
     self.anotherFrame.pack(fill = "both", padx = 10, pady = 10) 
     self.OpenFileButton = ttk.Button(self.anotherFrame, text = "Browse", command = self.load_file) 
     self.OpenFileButton.grid(row = 0, column = 0) 

    def load_file(self): 
     fname = askopenfilename(filetypes = (("Text files", "*.txt"), ("All files", "*.*"))) 
     another_points[:] = [] 
     self.points[:] = [] 
     if fname: 
     try: 
      print (fname) 
      with open(fname) as f: 
       for line in f: 
        another_points.append(float(line.rstrip())) 

      self.points = another_points 

     except: 
      print ("Error") 
     return 


    def PlotFrame(self): 
     self.PlotFrame = ttk.LabelFrame(self.master, text = "X/Y Coordinates") 
     self.PlotFrame.pack(side = LEFT, padx = 10, pady = 10) 

     self.width = 400 
     self.height = 350 
     self.pressure = 75 
     self.x_increment = 1 
     self.x_factor = 0.04 
     self.y_amplitude = 80 


     def draw(): 
     self.GraphFrame.delete(self.sin_line) 
     self.xy1 = [] 
     self.xy2 = self.points 
     for x in range(len(self.xy2)): 
      self.xy1.append(x + 25) 
      self.xy1.append(self.height - self.xy2[x]) 

     self.sin_line = self.GraphFrame.create_line(self.xy1, fill = "yellow") 

     self.UpdateButton = ttk.Button(self.PlotFrame, text = "Update", command = draw) 
     self.UpdateButton.pack() 

     self.GraphFrame = Canvas(self.PlotFrame, width = self.width, height = self.height, bg = "black") 

     self.GraphFrame.pack() 
     self.original = [] 

     self.mock = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
     for x in range(len(self.mock)): 
     self.original.append((x + 5)*10) 
     self.original.append((self.height - self.mock[x])/100) 

     self.sin_line = self.GraphFrame.create_line(self.original, fill = "yellow") 


if __name__ == "__main__": 
    master = Tk() 
    Waveform(master).pack(side = "top", fill ="both", expand = True) 
    master.mainloop() 

-Thanks

+1

到目前爲止您嘗試過什麼?現在,這個問題只是「爲我寫代碼」。 – Lafexlos

+0

這段代碼不會運行。 'AttributeError的:「波形」對象有沒有屬性「CustomizedWaveformes'' –

+0

您可以添加綁定鼠標移動的時候,當你點擊鼠標。您可以使用爲綁定函數提供的信息來繪製線條。 –

回答

2

開始

import tkinter as tk 
root = tk.Tk() 
def mmove(event): 
    print(event.x, event.y) 
root.bind('<Motion>', mmove) 
root.mainloop() 

然後,你想詳細說明。在畫布綁定運動,畫點在畫布上,追加對到一個列表,點擊綁定代替或附加,過濾分流等

+0

非常好的答案。簡直不敢相信。非常感謝!!! –

2

謝謝特里提供了一個非常有用的提示。我設法讓它工作。請注意,由於記錄了冗餘點,因此這不是最佳解決方案。這就是爲什麼我必須將它彈出很多。但它至少起作用。

import tkinter as tk 

class ExampleApp(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.previous_x = self.previous_y = 0 
     self.x = self.y = 0 
     self.points_recorded = [] 
     self.canvas = tk.Canvas(self, width=400, height=400, bg = "black", cursor="cross") 
     self.canvas.pack(side="top", fill="both", expand=True) 
     self.button_print = tk.Button(self, text = "Display points", command = self.print_points) 
     self.button_print.pack(side="top", fill="both", expand=True) 
     self.button_clear = tk.Button(self, text = "Clear", command = self.clear_all) 
     self.button_clear.pack(side="top", fill="both", expand=True) 
     self.canvas.bind("<Motion>", self.tell_me_where_you_are) 
     self.canvas.bind("<B1-Motion>", self.draw_from_where_you_are) 

    def clear_all(self): 
     self.canvas.delete("all") 

    def print_points(self): 
     if self.points_recorded: 
      self.points_recorded.pop() 
      self.points_recorded.pop() 
     self.canvas.create_line(self.points_recorded, fill = "yellow") 
     self.points_recorded[:] = [] 

    def tell_me_where_you_are(self, event): 
     self.previous_x = event.x 
     self.previous_y = event.y 

    def draw_from_where_you_are(self, event): 
     if self.points_recorded: 
      self.points_recorded.pop() 
      self.points_recorded.pop() 

     self.x = event.x 
     self.y = event.y 
     self.canvas.create_line(self.previous_x, self.previous_y, 
           self.x, self.y,fill="yellow") 
     self.points_recorded.append(self.previous_x) 
     self.points_recorded.append(self.previous_y) 
     self.points_recorded.append(self.x)  
     self.points_recorded.append(self.x)   
     self.previous_x = self.x 
     self.previous_y = self.y 

if __name__ == "__main__": 
    app = ExampleApp() 
    app.mainloop() 
+0

你能告訴我怎樣才能把它導出到圖像上?順便說一句,這是比其他的答案,謝謝好.... –

+1

我從來沒有這麼做過。所以,我在另一個SO帖子中發現了這個。希望能幫助到你!!! https://stackoverflow.com/questions/9886274/how-can-i-convert-canvas-content-to-an-image –