从Tkinter图像中收集数据后创建一个python字典

时间:2016-03-03 14:15:38

标签: python list dictionary

我正在尝试根据我从图像中取出的信息(坐标和图像类型)创建一个字典列表,方法是用矩形选择它。在按钮释放时,我想将提取的字典附加到空列表中。代码适用于第一个字典,但是当我选择第二个三角形时,我获得的字典会覆盖第一个字典。

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()

1 个答案:

答案 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

  

我想它的原因是,由于全局变量是如此危险,Python希望通过明确要求全局关键字来确保你真正知道你正在玩的是什么。

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'