我正在使用Python 3,对Python来说我是非常非常新的。我正在尝试创建一个游戏,并且我拥有的代码正在按预期的方式工作,但是当它运行时,它给了我某种错误。 (P.S.我知道如果只是乌龟而不是tkinter和turtle会更清洁。。。虽然这是一个项目,所以我没有选择,我必须同时使用两者。)
显示“ Tkinter回调中的异常”,然后向我提供此信息:
第60行,在西班牙组合命令中 span()+ spanishFlag() TypeError:+不支持的操作数类型:“ NoneType”和“ NoneType”
这是什么问题?我为我缺乏知识而道歉。请客气。感谢您能提供的任何帮助。
我不明白问题所在,所以我还没有尝试过任何东西。因此,如果有人可以查看我的代码并解释并显示问题,那就太好了!下面是我的迷宫游戏代码。如果您发现任何需要解决的问题,请让我知道并告诉我。预先谢谢你。
from turtle import RawTurtle, TurtleScreen
import tkinter
from tkinter import PhotoImage
largefont = ("Verdana", 12)
# Define function to create Spanish level.
def span():
pen.setup(level_1)
player.setup(level_1)
setup(level_1)
# Define function to create French level.
def fren():
pen.setup(level_2)
player.setup(level_2)
setup(level_2)
# Define function to create Japanese level.
def jpn():
pen.setup(level_3)
player.setup(level_3)
setup(level_3)
# Define function to create Turkish level.
def turk():
pen.setup(level_4)
player.setup(level_4)
setup(level_4)
# Create window and canvas using tkinter.
root = tkinter.Tk()
root.title("Language Labyrinth")
canvas = tkinter.Canvas(root, width=600, height=600)
canvas.pack()
screen = TurtleScreen(canvas)
screen.bgcolor('black')
# Define a function to set flag background for Spanish level
def spanishFlag():
screen.bgpic("spainflag.png")
# Define a function to set flag background for French level
def frenchFlag():
screen.bgpic("franceflaggrunge.png")
# Define a function to set flag background for Japanese level
def japaneseFlag():
screen.bgpic("japanflagoffwhite.png")
# Define a function to set flag background for Turkish level
def turkishFlag():
screen.bgpic("turkishflagdiagonal.png")
# Define a function to combine the level and background setup functions for Spanish level
def combinedSpanishCommands():
span() + spanishFlag()
# Define a function to combine the level and background setup functions for French level
def combinedFrenchCommands():
fren() + frenchFlag()
# Define a function to combine the level and background setup functions for Japanese level
def combinedJapaneseCommands():
jpn() + japaneseFlag()
# Define a function to combine the level and background setup functions for Turkish level
def combinedTurkishCommands():
turk() + turkishFlag()
# Create class with separate window to choose level.
class StartPage():
def __init__(self):
# Creation of second window.
wn = tkinter.Tk()
wn.title("Welcome!")
# Creation of game title on start page.
label = tkinter.Label(wn, text="Language Labyrinth", font=largefont)
label.pack()
# Create Spanish level button.
button = tkinter.Button(wn, text="Spanish", command= combinedSpanishCommands)
button.pack()
# Create French level button.
button2 = tkinter.Button(wn, text="French", command= combinedFrenchCommands)
button2.pack()
# Create Japanese level button.
button3 = tkinter.Button(wn, text="Japanese", command= combinedJapaneseCommands)
button3.pack()
# Create Turkish level button.
button4 = tkinter.Button(wn, text="Turkish", command= combinedTurkishCommands)
button4.pack()
# Create quit button for start page.
qbutton = tkinter.Button(wn, text="Quit", command=wn.destroy)
qbutton.pack()
start = StartPage()
# Create Pen class to draw the maze.
class Pen(RawTurtle):
def __init__(self):
super().__init__(screen, shape='square')
self.speed('fastest')
self.color('white')
self.penup()
# Create setup so the maze will be drawn.
def setup(self, level):
for y in range(len(level)):
screen_y = 288 - (y * 24)
for x in range(len(level[y])):
if level[y][x] == 'X':
screen_x = (x * 24) - 288
self.goto(screen_x, screen_y)
self.stamp()
walls.append((screen_x, screen_y))
# Create player class to have a player.
class Player(RawTurtle):
def __init__(self):
super().__init__(screen, shape='square')
self.penup()
self.speed('fastest')
self.color('black')
def bKey(self):
global color
print("b key pressed")
self.color('blue')
def rKey(self):
global color
print("r key pressed")
self.color('red')
def gKey(self):
global color
print("g key pressed")
self.color('green')
def pKey(self):
global color
print("p key pressed")
self.color('purple')
def yKey(self):
global color
print("y key pressed")
self.color('goldenrod')
def oKey(self):
global color
print("o key pressed")
self.color('orange')
# Create setup to create the player on the screen.
def setup(self, level):
for y in range(len(level)):
for x in range(len(level[y])):
if level[y][x] == 'P':
screen_x = (x * 24) - 288
screen_y = 288 - (y * 24)
self.goto(screen_x, screen_y)
return
# Define a function that will allow player to move up.
def move_up(self):
# Calculate the spot to move to.
movetoX = self.xcor()
movetoY = self.ycor() + 24
# Check if the space has a wall.
if (movetoX, movetoY) not in walls:
self.goto(movetoX, movetoY)
gold_encounter()
# Define a function that will allow player to move down.
def move_down(self):
# Calculate the spot to move to.
movetoX = self.xcor()
movetoY = self.ycor() - 24
# Check if the space has a wall.
if (movetoX, movetoY) not in walls:
self.goto(movetoX, movetoY)
gold_encounter()
# Define a function that will allow player to move left.
def move_left(self):
# Calculate the spot to move to.
movetoX = self.xcor() - 24
movetoY = self.ycor()
# Check if the space has a wall.
if (movetoX, movetoY) not in walls:
self.goto(movetoX, movetoY)
gold_encounter()
# Define a function that will allow player to move right.
def move_right(self):
# Calculate the spot to move to.
movetoX = self.xcor() + 24
movetoY = self.ycor()
# Check if the space has a wall.
if (movetoX, movetoY) not in walls:
self.goto(movetoX, movetoY)
gold_encounter()
# Check if player touches the question.
def collision(self, other):
return self.distance(other) < 5
# Create Question class to create the "gold" in the game.
class Question(RawTurtle):
def __init__(self, x, y):
super().__init__(screen, shape='circle', visible=False)
self.speed('fastest')
self.color('hotpink')
self.penup()
self.goto(x, y)
self.showturtle()
# Define function that will remove gold when collided with.
def destroy(self):
self.hideturtle()
# Define function to setup the "gold" in the game.
def setup(level):
for y in range(len(level)):
for x in range(len(level[y])):
char = level[y][x]
screen_x = -288 + (x * 24)
screen_y = 288 - (y * 24)
if char == 'Q':
questions.append(Question(screen_x, screen_y))
# Define a function for the quit button.
def quitPlaying():
root.destroy()
root.quit()
# Game loop in regards to the gold.
def gold_encounter():
# Check for player collision with a question.
# Iterate through the questions list.
for question in questions:
if player.collision(question):
# Destroy the question.
question.destroy()
# Remove question from questions list.
questions.remove(question)
# Create frame where button(s) will be.
frame = tkinter.Frame(root)
frame.pack()
# Add questions list.
questions = []
# Wall coordinate list.
walls = []
# Create a levels list.
levels = []
# Define first level.
level_1 = [
"XXXXXXXXXXXXXXXXXXXXXXXXX",
"XP XXXXXXX XXXXX",
"X XXXXXXX XXXXXX XXXXX",
"X XX XXXXXX XXXXX",
"X XX XXX XX",
"XXXXXX XX XXX Q XX",
"XXXXXX XX XXXXXX XXXXX",
"XXXXXX XX XXXX XXXXX",
"X XXX Q XXXX XXXXX",
"X XXX XXXXXXXXXXXXXXXXX",
"X XXXXXXXXXXXXXXX",
"X Q XXXXXXXX",
"XXXXXXXXXXXX XXXXX X",
"XXXXXXXXXXXXXXX XXXXX X",
"XXX XXXXXXXXXX X",
"XXX Q X",
"XXX XXXXXXXXXXXXX",
"XXXXXXXXXX XXXXXXXXXXXXX",
"XXXXXXXXXX X",
"XX XXXXX Q X",
"XX XXXXXXXXXXXXX XXXXX",
"XX XXXXXXXXXXXX XXXXX",
"XX Q XXXX X",
"XXXX X",
"XXXXXXXXXXXXXXXXXXXXXXXXX"
]
# Define second level.
level_2 = [
"XXXXXXXXXXXXXXXXXXXXXXXXX",
"XP XX XX XXXX",
"X XX XX XXXX",
"X XXXXXXX XX XX X",
"X XXXXXXX XX XX Q X",
"X XX XX XX XXXXX X",
"X XX XX XX XXXXX X",
"XQ Q XX X X",
"X XX X X",
"X XXXXXXX XXXXX XXXX",
"X XX XX X",
"XXXXXX XX Q X",
"XXXXXX XXXXXXXXXXXX X",
"X Q XX XX X",
"X XX XX X",
"XXXXXXXXXX XX X",
"XXXXXX X XX Q X",
"XXXXXX X XX XX X",
"X X X X",
"X Q X X X",
"XXXXXX XXXXXXXXXX X X",
"XXXXXX XXXXXXXXXX X",
"X X X",
"X XQ XXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXX"
]
# Define third level.
level_3 = [
"XXXXXXXXXXXXXXXXXXXXXXXXX",
"X X XP X",
"X Q X X X",
"X XXXX XXXXXXXXXX X",
"X XXXX XXXXXXXXXX X",
"X Q XX X",
"X XX X",
"XXXXXXXXXXXX XXXX XXX",
"X XXXX XXX",
"X XXXX XXX",
"XXXXX Q XXXXXXXXXXX XXX",
"X Q X",
"X X",
"XXXXXXXXXX Q XXXXXXX X",
"XXXXXXXXXX XXXXXXX X",
"XXXX XXXXXXXXX X",
"XXX XXXXXXXXX X",
"XXXXXX XXXXXXXXXXXX X",
"X X Q X",
"X Q X XXXX",
"XXXXXXX XXXXXX",
"XXXXXXXXXXXX Q XXXXXXXXXX",
"X X",
"X Q XXX Q X",
"XXXXXXXXXXXXXXXXXXXXXXXXX"
]
# Define fourth level.
level_4 = [
"XXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXX P XXXXXXXXXX",
"XXXXXXXXXX XXXXXXXXXX",
"XXXXXXXXXXX Q XXXXXXXXXXX",
"X X",
"X XXX X",
"XXXXX Q XXXXX Q XXXXX",
"X XXX X",
"XXXXXXXX X XXXXXXXX",
"X Q X Q X",
"X X X",
"XXXXXXXXXX QXQ XXXXXXXXXX",
"X X",
"X X",
"XXXXXXXXXXXXXXXXXXXXX X",
"XXXXXXXXXXXXXXXXXXXXX X",
"XXXXXX XXXXXXXXX X",
"XXXXXX XXXXXXX Q XXXXX",
"XQ X",
"X X",
"XXXXXXXXXXX XXXXXXX X",
"XXXXXXXX XXXXXXX X",
"XXXXXX XXXXXXXXXX X",
"XXXXX Q XXXXXXXXXXX Q X",
"XXXXXXXXXXXXXXXXXXXXXXXXX"
]
# Add the level(s) to the levels list.
levels.append(level_1)
levels.append(level_2)
levels.append(level_3)
levels.append(level_4)
# Class instances.
pen = Pen()
player = Player()
# Creation of quit button.
quitButton = tkinter.Button(frame, text='Quit', command=quitPlaying)
quitButton.pack()
# Button commands for player movement
screen.onkeypress(player.move_up, 'Up')
screen.onkeypress(player.move_down, 'Down')
screen.onkeypress(player.move_left, 'Left')
screen.onkeypress(player.move_right, 'Right')
# Button commands for customizable player colors
screen.onkeypress(player.bKey, "b")
screen.onkeypress(player.rKey, "r")
screen.onkeypress(player.gKey, "g")
screen.onkeypress(player.pKey, "p")
screen.onkeypress(player.yKey, "y")
screen.onkeypress(player.oKey, "o")
screen.listen()
# Call main game loop.
screen.mainloop()
就像我说的那样,游戏本身正在按应有的方式工作,但是它只收到“ Exception”消息,因此肯定存在一些问题。 再次感谢您。
答案 0 :(得分:1)
要组合功能,只需要将它们放在一个将要运行的功能中
def combinedSpanishCommands():
span()
spanishFlag()