2017-07-28 6 views
-1

EDIT: Ich habe den Code so bearbeitet, dass es ausführbar ist und alle Variablen definiert sind.for Schleife dauert nur letzten Eintrag Wert (Python/Tkinter)

Ich habe dieses Stück Code:

from Tkinter import * 

root = Tk() 

class question_list: 
    list = [] 

class question: 
    answers = [] 
    def __init__(self,content): 
     self.content = content 

class Emotion: 
    def __init__(self, name, value): 
     Emotion.name = name 
     Emotion.value = value 

class answer: 
    emotions = [Emotion("Anger",0)] 
    def __init__(self, content): 
     self.content = content 




questions = question_list() 
buttonlist = [] 
entries = [] 
clicked = 0 

questions.list.append(question("On a scale of 1-10, is it moral?")) 
for num in range(10): 
    questions.list[0].answers.append(answer(num+1)) 

frame1 = Frame(root) 
frame1.pack(anchor = 'w') 
Label1=Label(frame1, text = "You chose SCALE. Examine the scale below. Click each number to view a description and set the values for each given emotion.") 
Label1.pack(anchor = 'w') 

frame2 = Frame(frame1) 
frame2.pack() 
for num in range(1,11): 
    btn = Button(frame2, text=num, command = lambda num=num:scaleset(num)) 
    btn.pack(side=LEFT) 
    buttonlist.append(btn) 


def scaleset(n): 
    global clicked 
    buttonlist[n - 1].config(state=DISABLED) 
    clicked += 1 
    frame3 = Frame(frame2) 
    frame3.pack(anchor='w') 
    label2 = Label(frame3, text="Enter a value between -10 and 10 for each emotion. Enter \"0\" for no effect.", 
          wraplength=700, justify=LEFT) 
    label2.pack(anchor='w') 
    button = Button(frame3, text="Continue", command=lambda: reset()) 
    for number in range(len((questions.list[0].answers[0].emotions))): 
     frame = Frame(frame3) 
     frame.pack(anchor='w') 
     label = Label(frame, text=questions.list[0].answers[0].emotions[number].name) 
     label.pack(side=LEFT) 
     entry = Entry(frame) 
     entry.pack(side=RIGHT) 
     entries.append(entry) 
    frame4 = Frame(frame3) 
    frame4.pack(anchor='w') 
    button2 = Button(frame4, text="Done", command=lambda:set_scaleanswers(frame4)) 
    button2.pack(side=LEFT) 

    def set_scaleanswers(frame): 
     for num in range(len(questions.list[0].answers[0].emotions)): 
      questions.list[0].answers[clicked - 1].emotions[num].value = entries[num].get() 
      HeaderScale2 = Label(frame, text="Answer recorded.") 
      HeaderScale2.pack(side=RIGHT) 
      button.pack(anchor='w') 
      del entries[:] 

     button2.config(state=DISABLED) 

    def reset(): 
     frame3.destroy() 




root.mainloop() 

Say für die 1 Taste, die Benutzereingaben "1". Für die Schaltfläche 2 gibt der Benutzer "2" ein. Für die Schaltfläche 3 gibt der Benutzer "3" ein.

Meine erwarteten Ergebnisse sind:

questions.list[0].answers[0].emotions[0].value = 1 questions.list[0].answers[1].emotions[0].value = 2 questions.list[0].answers[2].emotions[0].value = 3

Stattdessen erhalte ich:

questions.list[0].answers[0].emotions[0].value = 3 questions.list[0].answers[1].emotions[0].value = 3 questions.list[0].answers[2].emotions[0].value = 3

Wie kann ich es beheben, damit ich meine gewünschte resu erhalten Es?

+0

Könnten Sie bitte eine [MCVE] (https://stackoverflow.com/help/mcve) – Feodoran

+0

Sie müssen zeigen uns die Definition von 'questions' einrichten. – BoarGules

+0

Definition von Fragen hinzugefügt @BoarGules – Naomi

Antwort

0

Die Instanz Emotion in allen Klasseninstanzen answer ist das gleiche Objekt. Wenn Sie es beispielsweise für eine answer Instanz ändern, wird es für alle Antworten geändert.

Sie können dies überprüfen, indem Sie ihre Adressen im Speicher vergleichen. Gleiche Adresse bedeutet dasselbe Objekt. (Sie erhalten eine andere Adresse gibt, aber es ist die gleiche aller Instanzen.)

>>> questions.list[0].answers[0].emotions 
[<__main__.Emotion instance at 0x7fdad37c7290>] 
>>> questions.list[0].answers[1].emotions 
[<__main__.Emotion instance at 0x7fdad37c7290>] 

Sie müssen ihre Definition ändern, so wird es beispielsweise spezifisch:

class answer: 
    def __init__(self, content): 
     self.emotions = [Emotion("Anger",0)] 
     self.content = content 

nun die verwendeten Adressen anders sein für jede Instanz:

>>> questions.list[0].answers[0].emotions 
[<__main__.Emotion instance at 0x7f4e4ce1ba28>] 
>>> questions.list[0].answers[1].emotions 
[<__main__.Emotion instance at 0x7f4e4b3575f0>] 
Verwandte Themen