2017-06-28 6 views
0

Ich möchte meine verschiedenen Checkboxen in einem Wörterbuch speichern, damit ich sie später aufrufen kann. Da ich gerne Aktionen basierend auf der Anzahl der Widgets mit len(self.il['Line2']) durchführen würde, brauche ich eine Möglichkeit, sie alle in einem Array zu speichern. Speichern jedes von Widgets in einem eindeutigen Eintrag wie:Store Widgets im Wörterbuch

for i in range(7): #INPUT LINE 2 
     self.il['Line2',i] = QtWidgets.QCheckBox(self.il2info[i],self) 
print(self.il['Line2',i]) 

--------output---------- 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A4398EE58> 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A4398EF78> 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A439690D8> 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A43969168> 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A439691F8> 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A43969288> 
<PyQt5.QtWidgets.QCheckBox object at 0x0000021A43969318> 

aber dann mein len(self.il['Line2']) Befehl funktioniert nicht. Ich habe versucht, so etwas wie die folgenden:

self.il['Line2'[i]] = QtWidgets.QCheckBox(self.il2info[i],self) 

aber einen Fehler von:

IndexError: string index out of range 

habe ich versucht, auch zu tun:

self.il['Line2':[i]] = QtWidgets.QCheckBox(self.il2info[i],self) 

aber ich bin mit der folgenden Normen erfüllt Fehler von:

TypeError: unhashable type: 'slice' 

Gibt es einen Syntaxfehler, den ich vermisse? Können Widget-Objekte nicht in Wörterbüchern gespeichert werden? Gibt es eine Möglichkeit für mich, ID-Widgets zu identifizieren, mit denen ich die ID im Wörterbuch speichern kann?

EDIT: Mein ursprüngliches Problem wurde gelöst, wie ich die Schlüssel/Werte meines Wörterbuchs falsch definierte. Ein Temp-Dictionary zu verwenden, um alle Widgets in einem Array zu sammeln und sie dann mit einem Schlüssel von 'Line2' meinem Hauptwörterbuch gleichzusetzen, behob das Problem.

+0

Sie sind ein Stück Objekt zu speichern, nicht was auch immer Ihre gewünschten Schlüssel. Können Sie Ihr Beispiel aktualisieren? –

+0

Ich fürchte, ich verstehe Ihren Kommentar nicht. Ich möchte, dass das "Objekt" als Wert für meine "Line2" -Taste gespeichert wird. Ich möchte nicht, dass das Objekt in Scheiben geschnitten wird. – JN3

+0

@ JN3 siehe meine Antwort – eyllanesc

Antwort

0

Wenn Sie ein Element hinzufügen, wie folgt:

d[val1, val2] = some_value 

ist ähnlich:

d[(val1, val2)] = some_value 

Das heißt, der Schlüssel ist ein Tupel, so dass Sie das Tupel als Schlüssel passieren muss, damit es gibt den Wert zurück.

new_value = d[(val1, val2)] 

In Ihrem Fall:

self.il['Line2', i] = some_value 
new_value = self.il['Line2', i] 

Wenn Sie zum Beispiel angeben:

self.il['Line2'[2]] 

Es ist äquivalent zu:

self.il['n'] 

Oder noch schlimmer, wenn Sie einen Index übergeben höher als die Anzahl der Buchstaben.

self.il['Line2'[6]] 

Hinweis: Was Sie ein Tupel setzen als ein Schlüssel nicht ein Array generiert, wenn Sie die Struktur eines Arrays bekommen Sie ein Wörterbuch mit Wörterbücher erstellen müssen.

tmp_dict = {} 
for i in range(7): 
    tmp_dict[i] = QtWidgets.QCheckBox(self.il2info[i],self) 
self.il['Line2'] = tmp_dict 

Dann, wenn Sie zugreifen möchten Sie verwenden:

#read 
new_value = self.il['Line2'][i] 
#write 
self.il['Line2'][i] = some_value 

Beispiel:

for i in range(len(self.il['Line2'])): 
    new_value = self.il['Line2'][i] 
    self.il['Line2'][i] = some_value 
+0

Also, wenn ich Sie richtig verstehe, was ich getan habe, ist die Schaffung einer Reihe von eindeutigen Schlüsseln, und nicht ein Schlüssel 'Line2' mit mehreren Werten. Ein Schlüssel mit einem Array von Werten würde ein Wörterbuch im Wörterbuch benötigen? – JN3

+0

@ JN3 Ich habe ein Beispiel hinzugefügt, wie es geht – eyllanesc

+0

Kann ich die Anzahl der Werte in self.il ['Line2'] mit dem Befehl len() bestimmen? – JN3