2016-08-04 60 views
0

hier ist ein Teil meines Codes aus den letzten Spiel, das ich versuchen, habePython Pickle die Daten nicht aktualisiert werden in tkinter

ich bin verwirrt über die Daten von [Beize] anwenden können nicht auf das Etikett geladen, um in [ tkinter]

es funktioniert, wenn ich bin speichern und Laden der Daten

from tkinter import * 
import pickle 

Prvs_controll = [3,3,3,3,3] 
Prvs_size = [1,1,1,1,1] 
GameData= [Prvs_controll, Prvs_size] 

class MainGame(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent   
     self.initUI() 

    def initUI(self): 
     global canvas 
     self.parent.title('PythonEuropaGame') 
     self.pack(fill=BOTH, expand=1) 
     tkframe = Frame(self) 
     canvas = Canvas(self) 
     canvas.pack(fill = BOTH, expand = 1) 
     canvas.update() 

def save(): 
    global GameData 
    with open('Save_01.pickle', 'wb') as handle: 
     pickle.dump(GameData, handle) 
     print(GameData) 
def load(): 
    global canvas 
    global GameData 
    with open('Save_01.pickle', 'rb') as handle: 
     GameData = pickle.load(handle) 
     Label_size_b.configure(text = Prvs_size[0]) 
     print(GameData) 

def change_controll(): 
    global GameData 
    GameData[0] = [9,9,9,9,9] 

def change_size(): 
    global GameData 
    GameData[1][0] += 150 
    Label_size_b.configure(text = Prvs_size[0]) 

root = Tk() 
ex = MainGame(root) 
root.geometry('900x650') 

Label_size_a = Label(root, text = 'Size') 
Label_size_b = Label(root, text = '---') 
Label_size_a.place(x = 700, y = 195) 
Label_size_b.place(x = 750, y = 195) 


Button_save = Button(root, text = 'Save', command = save) 
Button_load = Button(root, text = 'Load', command = load) 
Button_size_add = Button(root, text = 'Upgrade', command = change_size) 
Button_save.place(x = 700, y = 500) 
Button_load.place(x = 750, y = 500) 
Button_size_add.place(x = 800, y = 225) 

zuerst rief ich change_size() und save(),

es „gedruckt [3, 3, 3 , 3, 3], [151, 1, 1, 1, 1]] "

und das Label [Label_size_b] hatte die Änderung der Größe angezeigt (es gedruckt "151) und es wird gespeichert.

Wenn ich jedoch das Modul neu starte und load() aufruft, werden immer noch die Daten über "[3, 3, 3, 3, 3], [151, 1, 1, 1, 1]]" gedruckt.

Aber das Hauptproblem ist Label [Label_size_b] als „1“ gedruckt, aber nicht „151“ , das meine ich etwas geändert, und laden Sie es, aber das Etikett immer noch die Originaldaten drucken! (Siehe oben auf Code)

Ich denke, es kann das "globale" Problem sein, aber ich kann keine Möglichkeit finden, es zu korrigieren.

Antwort

2

Das Problem ist, diese Zeile in der load() Funktion:

Label_size_b.configure(text = Prvs_size[0]) 

Hier Prvs_size bezieht sich auf die globale Variable, die auf [1,1,1,1,1] initialisiert wird, wenn das Skript gestartet wird, und wird nie aktualisiert. Sie müssen die Werte aus der Beize-Datei in GameData wie folgt geladen zugreifen:

Dieser greift
Label_size_b.configure(text = GameData[1][0]) 

das von der zweiten Liste erste Element in der wie aus den eingelegten Daten geladen GameData Liste.

Es gibt ein ähnliches Problem in der change_size() Funktion.

+0

Danke, es ist gelöst – Montague27

+0

@ Montague27: nicht sicher, ob Sie meine letzte Aktualisierung bemerkt haben, aber es gibt ein ähnliches Problem in 'change_size()'. – mhawke

+0

Ja, ich wusste es. : D – Montague27