2014-02-16 15 views
1

我有一個畫布,我添加了各種對象,例如文本對象等。我爲每個畫布子對象添加「標記」屬性。在下面的例子中,我添加了一個字典爲這是絕對支持的「標籤」性質:畫布對象標籤:不是我最初給它的類型

import tkinter 

window = tkinter.Tk() 
myCanvas = tkinter.Canvas(window, width = 400, height = 400) 
myCanvas.pack() 

textItemTags = { "id": 1, "name": "test" } 
textItemContents = "asdf" 
textItem = myCanvas.create_text(1, 1, tags = textItemTags, text = textItemContents) 

# some method later on now tries to retrieve tag values for a selected canvas child object... 
searchTags = myCanvas.gettags(textItem) 

print(searchTags) # array of strings 
print(isinstance(searchTags[0], str)) # true..? 

問題:使用Canvas對象的gettags方法searchTags注返回的結果 - 這是一個字符串數組現在代表每個訂單項(「'ID':1,'名稱':'測試'」,「...」),不是最初通過的實際字典。

我的問題是:1)爲什麼是這個現在是一串字符串,而不是我傳入的原始字典(或至少克隆);和2)我可以解析這個字符串數組以完全重建我最初傳遞給create_text方法的可靠方法嗎?

免責聲明:相對較新的Python和tkinter,但檢索canvas子對象的標記值的結果對我來說似乎很奇怪。

回答

2

根據Tk canvas documentation

每個項目也可以有任意數量的與之相關的標籤。 標籤 只是一個字符串,它可以採用除整數之外的任何形式,即 。例如,x123是確定的,但123是不是...

而且根據Tkinter.Canvas.crate_text documentation

tags=

的標籤附加到這個項目,或者元組包含多個標籤的

似乎Tkinter/Tk將tags參數轉換爲字符串,如果它不是字符串也不是元組。


如何使用字典標籤名稱映射到詞典:

import tkinter 

window = tkinter.Tk() 
myCanvas = tkinter.Canvas(window, width = 400, height = 400) 
myCanvas.pack() 

tag_mapping = {}          # <---- 
tag_mapping['tag1'] = { "id": 1, "name": "test" }  # <---- 
textItemContents = "asdf" 
textItem = myCanvas.create_text(1, 1, tags='tag1', text = textItemContents) 

searchTags = myCanvas.gettags(textItem) 

print(searchTags) # => ('tag1',) 
print(searchTags[0]) # => tag1 
print(tag_mapping[searchTags[0]]) # => {'name': 'test', 'id': 1} 
print(isinstance(tag_mapping[searchTags[0]], dict)) # => True 
+0

感謝。 tkinter的文檔很難來,所以我會保存你的鏈接。 「標籤只是一個字符串」和「附加到這個項目的標籤,或包含多個標籤的元組」現在是有道理的。 –

+0

「,它可以採用除整數以外的任何形式。」剛注意到這部分。我只是分配了一個數字字符串標籤並將其讀回正常。例如:str「1」。這樣做我有什麼擔心? –

+0

@ bob-the-destroyer,只要標籤是'str',你就不用擔心它。 – falsetru

相關問題