python:在方法-屏幕加载之后,上面已经有了所有内容



我希望这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()

我想这有点像你在五个左右字母之后,标签被放在下一列。

希望这能奏效!如果不告诉我还需要什么:)

相关内容

最新更新