extract a dictionary from a string - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: extract a dictionary from a string (/thread-28659.html) |
extract a dictionary from a string - berc - Jul-28-2020 Hello everyone Please help me solve my little problem. Created an object in canvas tkinter (canvas.create_image(bot['coord'], image = bot['image'], tags = ('bot', bot ['name'], tag1))) and passed the dictionary as a tag (tag1) - {'name': 'bot_28', 'coord': (610, 160), 'health': 0.99, 'live': 0, 'age': 0, 'speed': 0.41, 'orient': 7, 'cargo': [], 'atak': 0.521, 'radar': 25, 'step': 0, 'near': [], 'image': <PIL.ImageTk.PhotoImage object at 0x000001D3269081D0>}. The dictionary in the tag gets the string type. Now I need to extract it, but I can't convert it back from a string to a dictionary - an error appears ('str' object has no attribute 'keys' - I wanted to see all the dictionary keys). I don't know how to fix it? RE: extract a dictionary from a string - deanhystad - Jul-28-2020 Have you tried using json.loads(string)? RE: extract a dictionary from a string - berc - Jul-29-2020 ... ... bot['name'] = 'bot_' + str(i) bot['coord'] = coord bot['gender'] = random.choice(gender) bot['healt'] = 0.99 bot['gormon'] = 0.5 bot['live'] = 0 bot['age'] = 0 bot['speed'] = round((random.random()), 2) bot['orient'] = random.randint(0, 7) bot['cargo'] = [] bot['atak'] = round((random.random()), 3) tag1 = bot bot['canvas'] = canvas2.create_image(bot['coord'], image = bot['image'], tags = ('bot', bot['name'], tag1)) ... ... collide = canvas2.find_overlapping(x1r, y1r, x2r, y2r) if len(collide) > 1: i = 0 for i1 in collide: if str(canvas2.gettags(collide[i])[1]) != str(bot['name']): vis = canvas2.gettags(collide[i]) print(str(name) + ' 0 vis: '+str(vis[0])) print(str(name) + ' 1 vis: '+str(vis[1])) print(str(name) + ' 2 vis: '+str(vis[2])) if vis[0] == 'bot': bott = vis[2] print(bott.keys()) Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\berckut\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:\Users\berckut\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 749, in callit func(*args) File "ai_bot_01.py", line 460, in collide_bot print(bott.keys()) AttributeError: 'str' object has no attribute 'keys'Yes, I used json, I used ele... It still leaves an error RE: extract a dictionary from a string - ndc85430 - Jul-29-2020 The error is pretty clear. Why do you expect bott (and hence vis[2] ) to be a dict?
RE: extract a dictionary from a string - berc - Jul-30-2020 ... ... bot = {} #[b]in the code snippet did not give this line, but it is[/b] bot['name'] = 'bot_' + str(i) bot['coord'] = coord bot['gender'] = random.choice(gender) bot['healt'] = 0.99 bot['gormon'] = 0.5 bot['live'] = 0 bot['age'] = 0 bot['speed'] = round((random.random()), 2) bot['orient'] = random.randint(0, 7) bot['cargo'] = [] bot['atak'] = round((random.random()), 3) tag1 = bot bot['canvas'] = canvas2.create_image(bot['coord'], image = bot['image'], tags = ('bot', bot['name'], tag1)) ... ... collide = canvas2.find_overlapping(x1r, y1r, x2r, y2r) if len(collide) > 1: i = 0 for i1 in collide: if str(canvas2.gettags(collide[i])[1]) != str(bot['name']): vis = canvas2.gettags(collide[i]) print(str(name) + ' 0 vis: '+str(vis[0])) print(str(name) + ' 1 vis: '+str(vis[1])) print(str(name) + ' 2 vis: '+str(vis[2])) if vis[0] == 'bot': bott = vis[2] print(bott.keys())because initially bot is a dictionary and I pass it to a tag called tag1. vis is a list of all tags retrieved by canvas2.gettags (collide [i]). vis [2] is the third tag in the list of passed tags and with 'print' it is seen as a dictionary (there are key-value pairs) I solved this problem in a workaround way - I transfer the number of the desired bot to the function (collide_bot (number)), and then, using the bot number from the list of all bots (Bots), I extract the necessary information for a specific bot |