2016-03-03 198 views
1

我想創建一個字典的列表,基於我從圖像(座標和圖像類型)中選取矩形的信息。在按鈕釋放時,我想將提取的字典追加到空列表中。該代碼適用於第一個字典,但是當我選擇第二個三角形時,我獲得的字典覆蓋了第一個。從Tkinter圖像收集數據後創建一個python字典

Could you please come up with a solution so that in the end i get the list of dictionaries like this: 

[{'bottom_right_coords': [447, 349], 'type': 'middle name', 'top_left_coords': [290, 311]}, {'bottom_right_coords': [447, 349], 'type': 'first name', 'top_left_coords': [290, 311]}, etc etc etc. ] 



import Tkinter as tk 
from Tkinter import * 
import PIL 
from PIL import Image, ImageTk 
import pygame 
import Pmw 
from collections import OrderedDict 

pygame.init() 

global d, D, dict_list 
global DEFAULTVALUE_OPTION 
global options 
DEFAULTVALUE_OPTION = "Select an option" 
options = ['address', 
      'name', 
      'occupation'] 
d = {} 
dict_list = [None] * 2000 
list = range(2000) 
D = OrderedDict.fromkeys(list) 



class ExampleApp(tk.Tk): 

    def __init__(self, parent = None): 
     tk.Tk.__init__(self, parent) 
     self.x = self.y = 0 
     self.canvas = tk.Canvas(self, width=700, height=700, cursor="cross", relief=SUNKEN) 
     self.canvas.bind("<ButtonPress-1>", self.on_button_press) 
     self.canvas.bind("<B1-Motion>", self.on_move_press) 
     self.canvas.bind("<ButtonRelease-1>", self.on_button_release) 

     self.rect = None 

     self.start_x = None 
     self.start_y = None 


     self._draw_image() 



    def _draw_image(self): 
     self.sbarV = Scrollbar(self, orient=VERTICAL) 
     self.sbarH = Scrollbar(self, orient=HORIZONTAL) 

     self.sbarV.config(command=self.canvas.yview) 
     self.sbarH.config(command=self.canvas.xview) 

     self.canvas.config(yscrollcommand=self.sbarV.set) 
     self.canvas.config(xscrollcommand=self.sbarH.set) 
     self.sbarV.pack(side=RIGHT, fill=Y) 
     self.sbarH.pack(side=BOTTOM, fill=X) 

     self.canvas.pack(side="top", fill="both", expand=True) 
     self.im = Image.open("/home/madalina/madalina/image/page-001.jpg") 
     width, height = self.im.size 
     self.canvas.config(scrollregion=(0, 0, width, height)) 
     self.tk_im = ImageTk.PhotoImage(self.im) 
     self.canvas.create_image(0,0,anchor="nw",image=self.tk_im) 





    def on_button_press(self, event): 
     # save mouse drag start position 
     self.start_x = event.x 
     self.start_y = event.y 
     d["top_left_coords"] = [self.start_x, self.start_y] 


     # create rectangle if not yet exist 
     #if not self.rect: 
     self.rect = self.canvas.create_rectangle(self.x, self.y, 100, 100, width = 2, outline = "gold") 

    def on_move_press(self, event): 
     curX, curY = (event.x, event.y) 

     # expand rectangle as you drag the mouse 
     self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY) 



    def on_button_release(self, event): 
     top = Tk() 
     Label(top, text="New Option").grid(row=0) 
     Label(top, text = "Coordinates").grid(row=1) 
     E1 = Entry(top, bd = 5) 
     E2 = Entry(top, bd = 5) 
     # e1 = E1.get() 
     # e2 = E2.get() 
     E1.grid(row=0, column=1) 
     E2.grid(row=1, column=1) 

     def addOption(): 
      d["type"] = E1.get() 
      print d 



     def createDict(): 
      dict_list.append(d) 
      print "lista de dictionare este " + str(dict_list) 

     B1 = Button(top, text = "ADD", command = addOption) 
     B1.grid(row=3, column=0, sticky=W, pady=4) 
     B1 = Button(top, text = "Create Dict", command = createDict) 
     B1.grid(row=3, column=1, sticky=W, pady=4) 

     d["bottom_right_coords"] = [event.x, event.y] 


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

我覺得這是罰款,首次用戶(好樣的!),但在未來你可能會得到更好的如果您致力於最大限度地減少您提交的代碼量,那麼結果就會顯現我希望這可以放在一個函數上,在這種情況下,它甚至可能是重複的 –

回答

0

找到你的問題

讓我們來看看這個功能在這裏

def on_button_press(self, event): 
    # save mouse drag start position 
    self.start_x = event.x 
    self.start_y = event.y 
    d["top_left_coords"] = [self.start_x, self.start_y] 

我喜歡那些前兩行。所以我懷疑最後一個是小事。

d["top_left_coords"] = [self.start_x, self.start_y] 

不是你的問題,但值得一提的

我的第一印象是: 「d是未申報的,所以這會崩潰」。不是這樣,因爲你已經聲明它是一個全局變量。所以我的第一個建議是:確保你肯定需要一個全局變量。 As this 2000+ voted answer says

我想象它的原因是,由於全局變量是如此危險,巨蟒要確保你真的知道這是你通過明確要求全球關鍵字玩什麼。

Here's某處開始,如果你想刪除全局變量。

如果你決定全局變量是要走的路,請請其命名爲東西比d

但更多的幫助到您問題

d詞典列表,並追加到它。順便說一句,元組可能更有意義比座標列表,因爲他們是不可改變的

d = [] 
... 
d.append({self.start_x,self.start_y}) 
... 
#retrieving last click 
print d[-1] 
# adding other things to the 'last click dictionary' 
d[-1]['type'] = 'foobar'