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

时间:2014-10-07 18:03:00

标签: python user-interface tkinter

我希望每隔几秒就会在屏幕上逐个显示这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()

我已经坚持了一段时间。希望有人能提供帮助。 感谢

2 个答案:

答案 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()

我认为这就像你在五个左右的字母后所做的那样,标签放在下一栏。

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