python主循环方法mainloop_python – “after”无限循环:永远不会进入mainloop

这是我的第一篇文章.我在两个月前考虑职业交换时开始编码,并正在研究俄罗斯方块克隆.我已经实现了大部分核心功能,但无法通过后循环让游戏不断刷新.

我正在使用Tkinter来制作我的Gui并且正在尝试面向事件的编程.

我的理解是,在Tkinter的(Time,Event)之后,应该安排在Time指定的延迟之后发生的事件回调函数.我认为代码应该在此之后继续执行后续项目.

我的帧刷新功能(game.updateBoard())完成了俄罗斯方块工作的大部分必要事件,然后使用after调用自身.我在初始化游戏实例时调用它一次.

game.updateboard()函数在无限期地调用自身,而不是继续进行mainloop().

我怀疑在工作之后我的想法并不是表现为继续执行脚本直到指定的延迟发生.我认为它正在等待回调终止继续.

我试图找到一个资源,但不能.

如果您有解决此问题,附加代码或一般编码的建议,我很高兴听到它们!这是一个学习过程,我很乐意尝试你的任何建议.

以下是代码的相关部分:

class game():

def __init__(self): #Set up board and image board

self.pieces = ["L","J","S","Z","T","O","I"]

self.board = boardFrame()

self.root = Tk()

self.root.title("Tetris")

self.root.geometry("250x525")

self.frame = Frame(self.root)

#set up black and green squares for display

self.bSquare = "bsquare.gif"

self.gSquare = "square.gif"

self.rSquare = "rsquare.gif"

self.image0 = PhotoImage(file = self.bSquare)

self.image1 = PhotoImage(file = self.gSquare)

self.image2 = PhotoImage(file = self.rSquare)

#get an initial piece to work with

self.activeBlock = piece(self.pieces[random.randint(0,6)])

#Tells program to lower block every half second

self.blockTimer = 0

self.updateBoard()

self.root.bind('', self.turn)

self.root.bind('', self.moveR)

self.root.bind('', self.moveL)

self.root.bind('',self.moveD)

print("Entering mainloop")

self.root.mainloop()

def turn(self, event):

self.activeBlock.deOccupy(self.board)

self.activeBlock.turn()

self.activeBlock.occupy(self.board)

self.drawGrid(self.board.grid)

def moveR(self, event):

self.activeBlock.deOccupy(self.board)

self.activeBlock.updatePos([1,0], self.board)

self.activeBlock.occupy(self.board)

self.drawGrid(self.board.grid)

def moveL(self, event):

if self.activeBlock.checkLeft(self.board) == False:

self.activeBlock.deOccupy(self.board)

self.activeBlock.updatePos([-1,0], self.board)

self.activeBlock.occupy(self.board)

self.drawGrid(self.board.grid)

def moveD(self, event): #find

self.activeBlock.deOccupy(self.board)

self.activeBlock.updatePos([0,-1],self.board)

if self.activeBlock.checkBottom(self.board) == True:

self.activeBlock.occupy(self.board)

self.activeBlock = piece(self.pieces[random.randint(0,6)])

## self.activeBlock = piece(self.pieces[1])

print("bottomed")

self.activeBlock.occupy(self.board)

self.activeBlock.occupy(self.board)

self.drawGrid(self.board.grid)

def drawGrid(self, dGrid):

#Generate squares to match tetris board

for widget in self.frame.children.values():

widget.destroy()

self.activeBlock.occupy(self.board)

for x in range(9,-1,-1):

for y in range(20,-1,-1):

if self.board.grid[x][y] == 1:

self.frame.displayA = Label(self.frame, image=self.image1)

## self.frame.displayA.image = self.image1

self.frame.displayA.grid(row=21-y, column=x)

else:

self.frame.displayA = Label(self.frame, image = self.image0)

## self.frame.displayA.image = self.image0

self.frame.displayA.grid(row=21-y, column=x)

self.frame.displayA = Label(self.frame, image = self.image2)

self.frame.displayA.grid(row = 21 - self.activeBlock.center[1], column = self.activeBlock.center[0])

self.frame.grid()

def updateBoard(self):

self.blockTimer += 1

"print updateBoard Loop"

## 1)check for keyboard commands

#1.1 move block by keyboard commands

#2) see if block has bottomed out, if it has, have it enter itself into the grid and generate a new block.

if self.activeBlock.checkBottom(self.board) == True:

self.activeBlock.occupy(self.board)

self.activeBlock = piece(self.pieces[random.randint(0,6)])

print("bottomed")

self.activeBlock.occupy(self.board)

#2.2 - if block has not bottomed and 50 frames (~.5 seconds) have passed, move the active block down a square after clearing its old space.

elif self.blockTimer%12 == 0:

self.activeBlock.deOccupy(self.board)

self.activeBlock.updatePos([0,-1], self.board)

self.activeBlock.occupy(self.board)

## 4) check for filled rows

for y in range(1,21):

for x in range(10):

rowFull = True

if self.board.grid[x][y] == 0:

rowFull == False

#4.1 if any row is filled, delete it and then move all rows above the deleted row down by one

if rowFull == True:

for x2 in range(10):

self.board.grid[x2][y] = 0

for y2 in range(y+1,21):

if self.board.grid[x2][y2] == 1:

self.board.grid[x2][y2] = 0

self.board.grid[x2][y2-1] = 1

#4.11 if the row is full and the row above it was full, delete the row again as well as the row above it, and move all rows down by 2

for x in range(10):

rowFull = True

if self.board.grid[x][y] == 0:

rowFull == False

if rowFull == True:

for x2 in range(10):

try:

self.board.grid[x2][y] = 0

self.board.grid[x2][y+1] = 0

except:

pass

for y2 in range(y+2,21):

try:

if self.board.grid[x2][y2] == 1:

self.board.grid[x2][y2] = 0

self.board.grid[x2][y2-2] = 1

except:

pass

#5) if there is a block in the top row, end the game loop

for x in range(10):

if self.board.grid[x][20] == 1:

game = "over"

#6) update image

self.activeBlock.occupy(self.board)

self.drawGrid(self.board.grid)

self.frame.after(500, self.updateBoard())

Game = game()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值