我希望每隔几秒就会在屏幕上逐个显示这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()
我已经坚持了一段时间。希望有人能提供帮助。 感谢
答案 0 :(得分:2)
root.after(10000, drawBoard())
after
的第二个参数应该是一个函数对象。但你在这里做的是说,“立即调用drawBoard,它的返回值将是after
的第二个参数”。不用括号试试吧。
root.after(10000, drawBoard)
(请记住在您使用它的两个地方更改after
电话)
此外,在drawBoard
函数中,root.after
将被调用8 * 8次,因此所有后续调用都将同时执行。如果您希望drawBoard
填写单个单元格,请等待X秒,填写单个单元格,等待X秒等,然后在首次成功填写单元格后{@ 1}}。此外,您忘记使用已完成的字母填充return
。
boardh
答案 1 :(得分:1)
好的,所以凯文让你中途,但同时加载的所有字母的问题不是由于使用了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()
我认为这就像你在五个左右的字母后所做的那样,标签放在下一栏。
希望这有效!如果不告诉我还需要什么:)