我希望这10个字母每隔几秒钟一个接一个地出现在屏幕上。出于某种原因,当我使用"after方法"时,它会等待,直到所有字母都在内部加载,然后显示屏幕上已经有了所有字母。这意味着它会等待15秒,然后加载屏幕上的所有字母。(我希望我解释清楚)
这是我的作品
class Game():
def __init__(self):
root = Tk()
root.geometry("1350x730")
global tile_frame_column # the labels that go on the screen of letters
tile_frame_column = {}
boardh = [[False for x in range(12)] for y in range(12)]
tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
def drawBoard():
tile_frame_column_counter=0
for x in range(8):
for y in range(8):
if not tiles_letter:
return
if not boardh[y][x]:
rand = random.choice(tiles_letter)
tile_frame_column[tile_frame_column_counter] = Label(root, text=rand, font="Helvetica 16 bold")
tile_frame_column[tile_frame_column_counter].place(x=(x)*64+5, y= (y)*64)
tile_frame_column_counter+=1
tiles_letter.remove(rand)
root.after(10000, drawBoard)
root.after(10000, drawBoard)
root.mainloop()
app=Game()
我已经被这个问题困扰了一段时间。希望有人能帮忙。感谢
root.after(10000, drawBoard())
after
的第二个参数应该是一个函数对象。但您在这里所做的是说,"立即调用drawBoard,它的返回值将是after
的第二个参数"。试着不用括号。
root.after(10000, drawBoard)
(记住在您使用的两个位置更改after
调用)
此外,在drawBoard
函数中,root.after
将被调用8*8次,因此所有后续调用都将同时执行。如果您希望drawBoard
填充单个单元格,请等待X秒、填充单个单元格、等待X秒等,则应在首次成功填充单元格后使用return
。此外,您忘记用已完成的字母填充boardh
。
#rest of function goes here...
tile_frame_column[tile_frame_column_counter].place(x=(x)*64+5, y= (y)*64)
tile_frame_column_counter+=1
tiles_letter.remove(rand)
boardh[y][x] = rand
root.after(1000, drawBoard)
return
好的,kevin让你做了一半,但同时加载所有字母的问题不是因为使用了after
函数,而是因为drawBoard
的一次运行生成了所有字母,你必须将for
语句更改为in range(1)
,如下所示:
for x in range(1):
for y in range(1):
这一次生成一个字母,但它们被放置在相同的位置(即,在彼此的顶部)。
为了解决这个问题,我建议你稍微改变一下你的方法。创建两个变量(用于x和y坐标系),每次运行drawBoard
时都会添加到这两个变量中。这是完整的,例如
from tkinter import *
import random
class Game():
def __init__(self):
root = Tk()
root.geometry("1350x730")
global tile_frame_column # the labels that go on the screen of letters
tile_frame_column = {}
global tile_frame_column_counter
global newvar1 # x coordinate
global newvar2 # y coordinate
tile_frame_column_counter = 0
newvar1 = 50
newvar2 = 50
tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
def drawBoard():
global tile_frame_column_counter
global newvar1
global newvar2
for x in range(1):
for y in range(1):
if not tiles_letter:
return
else:
rand = random.choice(tiles_letter)
tile_frame_column[tile_frame_column_counter] = Label(root, text=rand, font="Helvetica 16 bold")
tile_frame_column[tile_frame_column_counter].place(x = newvar1, y = newvar2)
tile_frame_column_counter+=1
if newvar2 > 300:
newvar1 += 50
newvar2 = 50 # to start at the next column
else:
newvar2 += 50
tiles_letter.remove(rand)
root.after(1000, drawBoard)
root.after(1000, drawBoard)
root.mainloop()
app=Game()
我想这有点像你在五个左右字母之后,标签被放在下一列。
希望这能奏效!如果不告诉我还需要什么:)