Pickle保存和加载问题,pygame应用程序

2024-09-29 17:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个小的随机生成器,当我试图加载保存的东西时,我遇到了一个问题。它没有显示任何错误,但它不工作。 这是我的代码,第78行是loadSave函数,第95行是createSave函数。因为我不能保存列表中的所有类,所以我只保存它的值,然后当我加载回来时,我创建了具有相同值的新类,加载部分不工作,我测试了它

from tkinter import *
from tkinter import simpledialog
import pygame as pg
import sys
import random
import os
import pickle

pg.init()
pg.font.init()
pg.display.set_caption("Random")

win = pg.display.set_mode((800, 600))

clock = pg.time.Clock()

isFirstDraw = True
numbers = []


def endScreen(win):
    while True:
        clock.tick(60)

        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                pg.font.quit()
                sys.exit()
            if event.type == pg.MOUSEBUTTONDOWN:
                pg.quit()
                pg.font.quit()
                sys.exit()

        win.fill((255, 255, 255))
        text = pg.font.SysFont("comicsans", 100).render("The end", True, (0, 0, 0))
        win.blit(text, (300, 235))
        pg.display.update()


def drawButtons(win, m_pos):
    if m_pos[0] >= 290 and m_pos[0] <= 490 and m_pos[1] >= 450 and m_pos[1] <= 515:
        pg.draw.rect(win, (155, 155, 155), ((290, 450), (200, 65)))
    else:
        pg.draw.rect(win, (177, 177, 177), ((290, 450), (200, 65)))

    text = pg.font.SysFont("comicsans", 25).render("Generate random", True, (0, 0, 0))
    text2 = pg.font.SysFont("comicsans", 25).render("number", True, (0, 0, 0))

    win.blit(text, (310, 455))
    win.blit(text2, (330, 485))

    ## next button

    if m_pos[0] >= 0 and m_pos[0] <= 200 and m_pos[1] >= 535 and m_pos[1] <= 600:
        pg.draw.rect(win, (155, 155, 155), ((0, 535), (200, 65)))
    else:
        pg.draw.rect(win, (177, 177, 177), ((0, 535), (200, 65)))

    text = pg.font.SysFont("comicsans", 35).render("Save", True, (0, 0, 0))

    win.blit(text, (35, 550))

    ## next button

    if m_pos[0] >= 600 and m_pos[0] <= 800 and m_pos[1] >= 535 and m_pos[1] <= 600:
        pg.draw.rect(win, (155, 155, 155), ((600, 535), (200, 65)))
    else:
        pg.draw.rect(win, (177, 177, 177), ((600, 535), (200, 65)))

    text = pg.font.SysFont(""comicsans", 25).render("Load", True, (0, 0, 0))
    text2 = pg.font.SysFont(""comicsans", 25).render("save", True, (0, 0, 0))

    win.blit(text, (670, 540))
    win.blit(text2, (660, 565))


def loadSave():
    try:
        pickle_in = open("numbers.save", "rb")
        loadNum = pickle.load(pickle_in)
        pickle_in.close()
    except FileNotFoundError:
        return numbers

    numbers = []
    print(numbers)
    for i in loadNum:
        numbers.append(Number(i[0], i[1], i[2], i[4], i[3]))



def createSave():
    try:
        os.remove("numbers.save")
    except:
        pass

    numSave = []
    for i in numbers:
        numSave.append([i.x, i.y, i.num, i.isDead, i.fontSize])

    pickle_out = open("numbers.save", "wb")
    pickle.dump(numSave, pickle_out)
    pickle_out.close()


def randomNum(win, answer, answer2):
    global randNum

    try:
        rand = random.randint(answer, answer2)

        if randNum == False:
            randNum = Number(376, 400, rand, fontSize=40)
        else:
            randNum.num = rand
        if numbers[rand - 1].isDead:
            randomNum(win, answer, answer2)
        else:
            numbers[rand - 1].isDead = True
    except RecursionError:
        endScreen(win)


class Number:
    def __init__(self, x, y, num, fontSize=40, isDead=False):
        self.x = x
        self.y = y
        self.num = num
        self.isDead = isDead
        self.text = False
        self.fontSize = fontSize

    def render(self):
        self.text = pg.font.SysFont("comicsans", self.fontSize).render(
            str(self.num), True, (0, 0, 0)
        )
        win.blit(self.text, (self.x, self.y))
        if self.isDead:
            if self.num >= 10:
                pg.draw.line(
                    win,
                    (255, 0, 0),
                    (self.x, self.y + 5),
                    (self.x + 45, self.y + 42),
                    5,
                )
                pg.draw.line(
                    win,
                    (255, 0, 0),
                    (self.x + 45, self.y + 5),
                    (self.x, self.y + 42),
                    5,
                )
            else:
                pg.draw.line(
                    win,
                    (255, 0, 0),
                    (self.x, self.y + 5),
                    (self.x + 25, self.y + 42),
                    4,
                )
                pg.draw.line(
                    win,
                    (255, 0, 0),
                    (self.x + 25, self.y + 5),
                    (self.x, self.y + 42),
                    4,
                )


def reDraw(win, anserw, anserw2, m_pos):
    global isFirstDraw, randNum
    win.fill((255, 255, 255))

    if isFirstDraw:
        previousPos = [10, 20]
        for i in range(anserw, anserw2 + 1):
            try:
                if (
                    numbers[-1].num == 15
                    or numbers[-1].num == 27
                    or numbers[-1].num == 39
                ):
                    previousPos[1] += 50
                    previousPos[0] = -45

                if numbers[-1].num >= 10:
                    numbers.append(Number(previousPos[0] + 65, previousPos[1], num=i))
                else:
                    numbers.append(Number(previousPos[0] + 45, previousPos[1], num=i))
            except:
                numbers.append(Number(previousPos[0], previousPos[1], num=i))

            if previousPos[0] >= 720:
                previousPos[1] += 50
                previousPos[0] = -45
            else:
                previousPos = [numbers[-1].x, numbers[-1].y]
        isFirstDraw = False

    for i in numbers:
        i.render()

    if randNum is not False:
        randNum.render()

    drawButtons(win, m_pos)

    pg.display.update()


def main():
    global win, isFirstDraw, randNum

    tk = Tk()
    tk.title("Input")
    tk.geometry("100x100")
    tk.withdraw()
    #'''
    answer = simpledialog.askinteger(
        "min:1, max:49", "A legkisebb szám:", parent=tk, minvalue=1, maxvalue=49
    )
    answer2 = simpledialog.askinteger(
        "min:1, max:50", "A legnagyobb szám:", parent=tk, minvalue=answer, maxvalue=50
    )  #'''
    # answer = 1
    # answer2 = 5
    tk.destroy()

    randNum = False
    numbers = []
    while True:
        clock.tick(60)
        m_pos = pg.mouse.get_pos()

        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                pg.font.quit()
                sys.exit()

            if (
                event.type == pg.MOUSEBUTTONDOWN
                and m_pos[0] > 290
                and m_pos[0] < 490
                and m_pos[1] > 450
                and m_pos[1] < 515
            ):
                randomNum(win, answer, answer2)
            elif (
                event.type == pg.MOUSEBUTTONDOWN
                and m_pos[0] >= 0
                and m_pos[0] <= 200
                and m_pos[1] >= 535
                and m_pos[1] <= 600
            ):
                createSave()
            elif (
                event.type == pg.MOUSEBUTTONDOWN
                and m_pos[0] >= 600
                and m_pos[0] <= 800
                and m_pos[1] >= 535
                and m_pos[1] <= 600
            ):
                numbers = loadSave()

        # print(m_pos)

        reDraw(win, answer, answer2, m_pos)


main()


Tags: andtextposselfeventtrueifrender
1条回答
网友
1楼 · 发布于 2024-09-29 17:20:55

在Python中,在函数外部或全局范围内声明的变量称为全局变量。这意味着可以在函数内部或外部访问全局变量。
在函数体内部或局部范围内声明的变量称为局部变量

如果要将变量解释为全局变量,必须使用^{} statement

def loadSave():
    global numbers # <  

    try:
        pickle_in = open("numbers.save", "rb")
        loadNum = pickle.load(pickle_in)
        pickle_in.close()
    except FileNotFoundError:
        return numbers

    numbers = []
    print(numbers)
    for i in loadNum:
        numbers.append(Number(i[0], i[1], i[2], i[4], i[3]))

在这种情况下,可以避免使用global语句。与其创建新列表(numbers = []),不如创建列表(numbers.clear()):

def loadSave():
    try:
        pickle_in = open("numbers.save", "rb")
        loadNum = pickle.load(pickle_in)
        pickle_in.close()
    except FileNotFoundError:
        return numbers

    numbers.clear() # <  
    print(numbers)
    for i in loadNum:
        numbers.append(Number(i[0], i[1], i[2], i[4], i[3]))

相关问题 更多 >

    热门问题