使用pyinstaller编译时如何修复AttributeError

时间:2018-12-28 23:53:46

标签: python pyinstaller

当我使用pyinstaller编译python程序时,在编译结束时出现此错误:

  File "c:\users\red4d\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\hooks\pre_safe_import_module\hook-setuptools.extern.six.moves.py", line 34, in pre_safe_import_module
    for real_module_name, six_module_name in real_to_six_module_name.items():
AttributeError: 'str' object has no attribute 'items'

昨天我没有收到此错误,并且我没有重大更改代码。请帮忙!

我有大量的代码,但是我认为问题出在以下地方:

def settings():
    global menu_done
    global submenu
    try:
        if v.sport.lower() == "football":
            import football.initialize as img
        elif v.sport.lower() == "hockey":
            import hockey.initialize as img
    except:
        v.sport = ""

    clear()
    print("SETTINGS\n", bold=True)
    print("Note: Settings will not update until menu is exited.\n", italic=True)

    print("1. Sport: " + v.sport)
    print("2. Logo")
    print("3. Home Name: " + v.home_name)
    print("4. Home Standings: " + v.home_standings)
    print("5. Home Color: " + str(v.home_color))
    print("6. Home Logo")
    print("7. Guest Name: " + v.guest_name)
    print("8. Guest Standings: " + v.guest_standings)
    print("9. Guest Color: " + str(v.guest_color))
    print("10. Guest Logo")
    print("11. Possession Position: " + v.possession_position)

    print("\n12. Return")
    print("13. Exit")

    while True:
        if menu_done:
            submenu = 0
            break
        input(characters="numbers")
        if submenu < 1 or submenu > 13:
            print("Please input a numbered option (1 - 13).")
        else:
            break

    #Sport
    if submenu == 1:
        clear()
        print("SETTINGS\n", bold=True)
        print("Choose Sport\n")
        print("1. Football")
        print("2. Hockey")
        print("3. Return")

        while True:
            if menu_done:
                submenu = 0
                break
            else:
                input(characters="numbers")
            if submenu < 1 or submenu > 3:
                print("Please input a numbered option (1 - 3).")
            else:
                break

        if submenu == 3:
            settings()
        elif submenu == 1 or submenu == 2:
            print("\nThis setting requires a program restart, your scores will not be saved.\n")
            print("Would you like to continue with the restart?\n")
            print("1. Yes, Restart")
            print("2. Return")

            while True:
                if menu_done:
                    break
                input(characters="numbers")
                if submenu == 1:
                    if submenu == 1:
                        v.sport = "Football"
                    elif submenu == 2:
                        v.sport = "Hockey"
                    write(v.sport, 2)
                    v.restart = True
                    v.done = True
                    menu_done = True
                elif submenu == 2:
                    settings()
                else:
                    submenu = "Please input a numbered option (1, 2)."
                    print_input()

    #Logo
    elif submenu == 2:
        clear()

        print("SETTINGS\n", bold=True)
        print("Choose A New Logo\n")

        if not menu_done:
            if v.open_image("assets/logo.png", 86):
                img.logo_img = pygame.transform.scale(pygame.image.load('assets/logo.png'), (86, 86))
            else:
                submenu = "ERROR: Please select an image file (.png, .jpg, .jpeg, .gif)"
                print_input()
                time.sleep(2)
                submenu = ""

        settings()

    #Home Name
    elif submenu == 3:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Home Name")
        print("<12 characters recommended\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.home_name = submenu
                write(v.home_name, 5)
                settings()

    #Home Standings
    elif submenu == 4:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Home Standings\n")
        print("\"#-#\" or \"#-#-#\"\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.home_standings = submenu
                write(v.home_standings, 8)
                settings()

    #Home Color
    elif submenu == 5:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Home Color\n")
        print("Color Window Will Open (Close All Windows Before Continuing)\n")

        root = tkinter.Tk()
        col = askcolor(color=v.home_color, parent=None, title="Home Color", alpha=False)
        root.mainloop()

        if col[0] is not None:
            write(str(col[0]), 11)
            v.home_color = col[0]
            v.home_dark_color = list()
            for x in range(3):
                if v.home_color[x] >= 30:
                    v.home_dark_color.append(v.home_color[x] - 30)
                else:
                    v.home_dark_color.append(0)

        settings()

        # if not menu_done:
        #     input()
        #     if submenu == "1":
        #         settings()
        #     else:
        #         while True:
        #             try:
        #                 v.home_color = submenu
        #                 write(str(v.home_color), 11)
        #                 v.home_color = v.home_color.replace("(", "")
        #                 v.home_color = v.home_color.replace(")", "")
        #                 v.home_color = (int(v.home_color.split(",")[0]), int(v.home_color.split(",")[1]), int(v.home_color.split(",")[2]))
        #                 v.home_dark_color = list()
        #                 for x in range(3):
        #                     if v.home_color[x] >= 30:
        #                         v.home_dark_color.append(v.home_color[x] - 30)
        #                     else:
        #                         v.home_dark_color.append(0)
        #                 settings()
        #                 break
        #             except:
        #                 print("\nPlease use format \"#, #, #\"")
        #                 input()

    #Home Logo
    elif submenu == 6:
        clear()

        print("SETTINGS\n", bold=True)
        print("Choose A New Home Logo\n")

        if not menu_done:
            if v.open_image("assets/home_logo.png", 45):
                img.home_logo_img = pygame.transform.scale(pygame.image.load('assets/home_logo.png'), (45, 45))
            else:
                submenu = "ERROR: Please select an image file (.png, .jpg, .jpeg, .gif)"
                print_input()
                time.sleep(2)
                submenu = ""

        settings()

    #Guest Name
    elif submenu == 7:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Guest Name")
        print("<12 characters recommended\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.guest_name = submenu
                write(v.guest_name, 14)
                settings()

    #Guest Standings
    elif submenu == 8:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Guest Standings")
        print("\"#-#\" or \"#-#-#\"\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.guest_standings = submenu
                write(v.guest_standings, 17)
                settings()

    #Guest Color
    elif submenu == 9:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Guest Color\n")
        print("Color Window Will Open (Close All Windows Before Continuing)\n")

        root = tkinter.Tk()
        col = askcolor(color=v.guest_color, parent=None, title="Guest Color", alpha=False)
        root.mainloop()

        if col[0] is not None:
            write(str(col[0]), 11)
            v.guest_color = col[0]
            v.guest_dark_color = list()
            for x in range(3):
                if v.guest_color[x] >= 30:
                    v.guest_dark_color.append(v.guest_color[x] - 30)
                else:
                    v.guest_dark_color.append(0)

        settings()

    #Guest Logo
    elif submenu == 10:
        clear()

        print("SETTINGS\n", bold=True)
        print("Choose A New Guest Logo\n")

        if not menu_done:
            if v.open_image("assets/guest_logo.png", 45):
                img.guest_logo_img = pygame.transform.scale(pygame.image.load('assets/guest_logo.png'), (45, 45))
            else:
                submenu = "ERROR: Please select an image file (.png, .jpg, .jpeg, .gif)"
                print_input()
                time.sleep(2)
                submenu = ""

        settings()

    #Possession Position
    elif submenu == 11:
        clear()
        print("SETTINGS\n", bold=True)
        print("Choose a Possession Position")
        print("(For Football Only)\n")
        print("1. Top (recommended)")
        print("2. Bottom")
        print("3. None")
        print("4. Return")

        while True:
            if menu_done:
                break
            input(characters="numbers")
            if submenu == 4:
                settings()
            elif submenu == 1 or submenu == 2 or submenu == 3:
                if submenu == 1:
                    v.possession_position = "top"
                elif submenu == 2:
                    v.possession_position = "bottom"
                elif submenu == 3:
                    v.possession_position = "none"
                    write(v.possession_position, 23)
                settings()
                break
            else:
                print("Please input a numbered option (1, 2, 3, 4).")

    #Return
    elif submenu == 12:
        menu()

    #Exit
    elif submenu == 13:
        menu_done = True

这是项目中完整的单个文件:

import pygame
import default as v
#import os
import time
#import webbrowser
import tkinter
import tkinter.ttk
from tkcolorpicker import askcolor

#Primary Menu Functions

def menu():
    global menu_done
    global submenu
    menu_done = False
    clear()
    print("MENU\n", bold=True)
    print("1. Instructions")
    print("2. History")
    print("3. Settings")
    print("4. Quit Scoreboard")
    print("5. Exit")

    while True:
        if menu_done:
            break
        input(characters="numbers")
        if submenu == 1:
            instructions()
        elif submenu == 2:
            history()
        elif submenu == 3:
            settings()
        elif submenu == 4:
            quit()
        elif submenu == 5:
            menu_done = True
            break
        else:
            submenu = "Please input a numbered option (1 - 5)."
            print_input()

def instructions():
    global menu_done
    global submenu
    clear()
    print("INSTRUCTIONS\n", bold=True)
    print("Instructions Window Will Open (Close Before Continuing)")

    #webbrowser.open(os.getcwd() + "/assets/ReadMe.txt")

    root = tkinter.Tk()
    root.title("Instructions")
    S = tkinter.Scrollbar(root)
    T = tkinter.Text(root, height=34, width=110)
    S.pack(side="right", fill="y")
    T.pack(side="left", fill="y")
    S.config(command=T.yview)
    T.config(yscrollcommand=S.set)
    T.insert("end", open("assets/ReadMe.txt").read())
    tkinter.mainloop()

    menu()

def history():
    global menu_done
    global submenu
    clear()
    print("HISTORY", bold=True)
    print(v.history)

    print("\n1. Return")
    print("2. Exit")

    while True:
        if menu_done:
            break
        input(characters="numbers")
        if submenu == 1:
            menu()
            break
        elif submenu == 2:
            menu_done = True
            break
        else:
            submenu = "Please input a numbered option (1, 2)."
            print_input()

def settings():
    global menu_done
    global submenu
    try:
        if v.sport.lower() == "football":
            import football.initialize as img
        elif v.sport.lower() == "hockey":
            import hockey.initialize as img
    except:
        v.sport = ""

    clear()
    print("SETTINGS\n", bold=True)
    print("Note: Settings will not update until menu is exited.\n", italic=True)

    print("1. Sport: " + v.sport)
    print("2. Logo")
    print("3. Home Name: " + v.home_name)
    print("4. Home Standings: " + v.home_standings)
    print("5. Home Color: " + str(v.home_color))
    print("6. Home Logo")
    print("7. Guest Name: " + v.guest_name)
    print("8. Guest Standings: " + v.guest_standings)
    print("9. Guest Color: " + str(v.guest_color))
    print("10. Guest Logo")
    print("11. Possession Position: " + v.possession_position)

    print("\n12. Return")
    print("13. Exit")

    while True:
        if menu_done:
            submenu = 0
            break
        input(characters="numbers")
        if submenu < 1 or submenu > 13:
            print("Please input a numbered option (1 - 13).")
        else:
            break

    #Sport
    if submenu == 1:
        clear()
        print("SETTINGS\n", bold=True)
        print("Choose Sport\n")
        print("1. Football")
        print("2. Hockey")
        print("3. Return")

        while True:
            if menu_done:
                submenu = 0
                break
            else:
                input(characters="numbers")
            if submenu < 1 or submenu > 3:
                print("Please input a numbered option (1 - 3).")
            else:
                break

        if submenu == 3:
            settings()
        elif submenu == 1 or submenu == 2:
            print("\nThis setting requires a program restart, your scores will not be saved.\n")
            print("Would you like to continue with the restart?\n")
            print("1. Yes, Restart")
            print("2. Return")

            while True:
                if menu_done:
                    break
                input(characters="numbers")
                if submenu == 1:
                    if submenu == 1:
                        v.sport = "Football"
                    elif submenu == 2:
                        v.sport = "Hockey"
                    write(v.sport, 2)
                    v.restart = True
                    v.done = True
                    menu_done = True
                elif submenu == 2:
                    settings()
                else:
                    submenu = "Please input a numbered option (1, 2)."
                    print_input()

    #Logo
    elif submenu == 2:
        clear()

        print("SETTINGS\n", bold=True)
        print("Choose A New Logo\n")

        if not menu_done:
            if v.open_image("assets/logo.png", 86):
                img.logo_img = pygame.transform.scale(pygame.image.load('assets/logo.png'), (86, 86))
            else:
                submenu = "ERROR: Please select an image file (.png, .jpg, .jpeg, .gif)"
                print_input()
                time.sleep(2)
                submenu = ""

        settings()

    #Home Name
    elif submenu == 3:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Home Name")
        print("<12 characters recommended\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.home_name = submenu
                write(v.home_name, 5)
                settings()

    #Home Standings
    elif submenu == 4:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Home Standings\n")
        print("\"#-#\" or \"#-#-#\"\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.home_standings = submenu
                write(v.home_standings, 8)
                settings()

    #Home Color
    elif submenu == 5:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Home Color\n")
        print("Color Window Will Open (Close All Windows Before Continuing)\n")

        root = tkinter.Tk()
        col = askcolor(color=v.home_color, parent=None, title="Home Color", alpha=False)
        root.mainloop()

        if col[0] is not None:
            write(str(col[0]), 11)
            v.home_color = col[0]
            v.home_dark_color = list()
            for x in range(3):
                if v.home_color[x] >= 30:
                    v.home_dark_color.append(v.home_color[x] - 30)
                else:
                    v.home_dark_color.append(0)

        settings()

        # if not menu_done:
        #     input()
        #     if submenu == "1":
        #         settings()
        #     else:
        #         while True:
        #             try:
        #                 v.home_color = submenu
        #                 write(str(v.home_color), 11)
        #                 v.home_color = v.home_color.replace("(", "")
        #                 v.home_color = v.home_color.replace(")", "")
        #                 v.home_color = (int(v.home_color.split(",")[0]), int(v.home_color.split(",")[1]), int(v.home_color.split(",")[2]))
        #                 v.home_dark_color = list()
        #                 for x in range(3):
        #                     if v.home_color[x] >= 30:
        #                         v.home_dark_color.append(v.home_color[x] - 30)
        #                     else:
        #                         v.home_dark_color.append(0)
        #                 settings()
        #                 break
        #             except:
        #                 print("\nPlease use format \"#, #, #\"")
        #                 input()

    #Home Logo
    elif submenu == 6:
        clear()

        print("SETTINGS\n", bold=True)
        print("Choose A New Home Logo\n")

        if not menu_done:
            if v.open_image("assets/home_logo.png", 45):
                img.home_logo_img = pygame.transform.scale(pygame.image.load('assets/home_logo.png'), (45, 45))
            else:
                submenu = "ERROR: Please select an image file (.png, .jpg, .jpeg, .gif)"
                print_input()
                time.sleep(2)
                submenu = ""

        settings()

    #Guest Name
    elif submenu == 7:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Guest Name")
        print("<12 characters recommended\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.guest_name = submenu
                write(v.guest_name, 14)
                settings()

    #Guest Standings
    elif submenu == 8:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Guest Standings")
        print("\"#-#\" or \"#-#-#\"\n")
        print("1. Return")

        if not menu_done:
            input()
            if submenu == "1":
                settings()
            else:
                v.guest_standings = submenu
                write(v.guest_standings, 17)
                settings()

    #Guest Color
    elif submenu == 9:
        clear()
        print("SETTINGS\n", bold=True)
        print("Enter New Guest Color\n")
        print("Color Window Will Open (Close All Windows Before Continuing)\n")

        root = tkinter.Tk()
        col = askcolor(color=v.guest_color, parent=None, title="Guest Color", alpha=False)
        root.mainloop()

        if col[0] is not None:
            write(str(col[0]), 11)
            v.guest_color = col[0]
            v.guest_dark_color = list()
            for x in range(3):
                if v.guest_color[x] >= 30:
                    v.guest_dark_color.append(v.guest_color[x] - 30)
                else:
                    v.guest_dark_color.append(0)

        settings()

    #Guest Logo
    elif submenu == 10:
        clear()

        print("SETTINGS\n", bold=True)
        print("Choose A New Guest Logo\n")

        if not menu_done:
            if v.open_image("assets/guest_logo.png", 45):
                img.guest_logo_img = pygame.transform.scale(pygame.image.load('assets/guest_logo.png'), (45, 45))
            else:
                submenu = "ERROR: Please select an image file (.png, .jpg, .jpeg, .gif)"
                print_input()
                time.sleep(2)
                submenu = ""

        settings()

    #Possession Position
    elif submenu == 11:
        clear()
        print("SETTINGS\n", bold=True)
        print("Choose a Possession Position")
        print("(For Football Only)\n")
        print("1. Top (recommended)")
        print("2. Bottom")
        print("3. None")
        print("4. Return")

        while True:
            if menu_done:
                break
            input(characters="numbers")
            if submenu == 4:
                settings()
            elif submenu == 1 or submenu == 2 or submenu == 3:
                if submenu == 1:
                    v.possession_position = "top"
                elif submenu == 2:
                    v.possession_position = "bottom"
                elif submenu == 3:
                    v.possession_position = "none"
                    write(v.possession_position, 23)
                settings()
                break
            else:
                print("Please input a numbered option (1, 2, 3, 4).")

    #Return
    elif submenu == 12:
        menu()

    #Exit
    elif submenu == 13:
        menu_done = True

def quit():
    global menu_done
    global submenu
    menu_done = False
    clear()
    print("QUIT\n", bold=True)
    print("Are you sure you want to quit? Your work will not be saved.\n")

    print("1. Yes, Quit")
    print("2. Return")
    print("3. Exit")

    while True:
        if menu_done:
            break
        input(characters="numbers")
        if submenu == 1:
            v.done = True
            v.restart = False
            menu_done = True
            break
        elif submenu == 2:
            menu()
            break
        elif submenu == 3:
            menu_done = True
            break
        else:
            submenu = "Please input a numbered option (1 - 3)."
            print_input()

#Simple Action Functions

def clear():
    global text_line
    global submenu
    global submenu_go
    pygame.draw.rect(v.screen, (255, 255, 255), [0, 0, 1235, 559])  #[x position, y position, width, height]
    pygame.display.flip()  #Refresh Screen
    text_line = 0
    submenu = ""
    submenu_go = False

def print(text, **kwargs):
    global text_line
    font_menu = pygame.font.SysFont('Courier New', 18, bold=kwargs.get("bold", None), italic=kwargs.get("italic", None))
    for line in text.split("\n"):
        menu1 = font_menu.render(line, True, (0, 0, 0))
        v.screen.blit(menu1, (617 - (menu1.get_rect().width/2), text_line*18))
        pygame.display.flip() #Refresh Screen
        text_line += 1

def input(**kwargs):
    global submenu_go
    while not submenu_go:
        menu_check_events(characters=kwargs.get("characters", None))
    submenu_go = False

def print_input():
    global text_line
    global submenu
    pygame.draw.rect(v.screen, (255, 255, 255), [0, (text_line + 1) * 18, 1235, 18])
    font_menu = pygame.font.SysFont('Courier New', 18)
    menu1 = font_menu.render(submenu, True, (0, 0, 0))
    v.screen.blit(menu1, (617 - (menu1.get_rect().width/2), (text_line + 1) * 18))
    pygame.display.flip() #Refresh Screen

def write(string, line):
    with open("assets/settings/Settings.txt") as settings:
        config = settings.readlines()
    file = open("assets/settings/Settings.txt","w")
    for re_line in range(0, line - 1):
        file.write(config[re_line])
    file.write(string + "\n")
    for re_line in range(line, len(config)):
        file.write(config[re_line])

def menu_check_events(**kwargs):
    global menu_done
    global submenu
    global submenu_go
    characters = kwargs.get("characters", None)
    for event in pygame.event.get():  #Event Occurs
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:  #Key Pressed
            try:
                if "Please" in submenu:
                    submenu = ""
            except:
                pass
            if event.key == pygame.K_ESCAPE:  #Escape Key
                menu_done = True
                submenu_go = True
            elif event.key == pygame.K_RETURN:
                if submenu != "":
                    if characters == "numbers":
                        submenu = int(submenu)
                    submenu_go = True
            elif event.key == pygame.K_BACKSPACE:
                submenu = submenu[:-1]
                print_input()
            else:
                try:
                    if -1 < int(event.unicode) < 10:
                        submenu += event.unicode
                        print_input()
                except:
                    if not characters == "numbers":
                        submenu += event.unicode
                        print_input()

0 个答案:

没有答案