Python pickle 的数据无法在 tkinter 中更新
Python pickle's data can't update in tkinter
这是我最近尝试制作的游戏的一部分代码
我对从 [pickle] 加载的数据无法应用于 [tkinter] 中的标签感到困惑
它在我保存和加载数据时有效
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)
起初,我调用了change_size()和save(),
它打印了“[3, 3, 3, 3, 3], [151, 1, 1, 1, 1]]”
并且标签[Label_size_b] 显示了尺寸的变化(它打印出“151”)并被保存。
然而,当我重新启动模块并调用 load() 时,它仍然打印上面的数据 "[3, 3, 3, 3, 3], [151, 1, 1, 1, 1]]" 。
但主要问题是标签[Label_size_b] 打印为“1”而不是“151”
这意味着我改变了一些东西并加载了它,但标签仍然打印原始数据!(参见代码顶部)
我想这可能是 "global" 的问题,但我找不到任何方法来纠正它。
问题是 load()
函数中的这一行:
Label_size_b.configure(text = Prvs_size[0])
这里的Prvs_size
指的是脚本启动时初始化为[1,1,1,1,1]
的全局变量,永远不会更新。您需要像这样访问从 pickle 文件加载到 GameData
中的值:
Label_size_b.configure(text = GameData[1][0])
这会访问 GameData
列表中第二个列表的第一个元素,如从腌制数据中加载的那样。
change_size()
函数中也有类似的问题。
这是我最近尝试制作的游戏的一部分代码
我对从 [pickle] 加载的数据无法应用于 [tkinter] 中的标签感到困惑
它在我保存和加载数据时有效
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)
起初,我调用了change_size()和save(),
它打印了“[3, 3, 3, 3, 3], [151, 1, 1, 1, 1]]”
并且标签[Label_size_b] 显示了尺寸的变化(它打印出“151”)并被保存。
然而,当我重新启动模块并调用 load() 时,它仍然打印上面的数据 "[3, 3, 3, 3, 3], [151, 1, 1, 1, 1]]" 。
但主要问题是标签[Label_size_b] 打印为“1”而不是“151” 这意味着我改变了一些东西并加载了它,但标签仍然打印原始数据!(参见代码顶部)
我想这可能是 "global" 的问题,但我找不到任何方法来纠正它。
问题是 load()
函数中的这一行:
Label_size_b.configure(text = Prvs_size[0])
这里的Prvs_size
指的是脚本启动时初始化为[1,1,1,1,1]
的全局变量,永远不会更新。您需要像这样访问从 pickle 文件加载到 GameData
中的值:
Label_size_b.configure(text = GameData[1][0])
这会访问 GameData
列表中第二个列表的第一个元素,如从腌制数据中加载的那样。
change_size()
函数中也有类似的问题。