tkinter:如何使用包布局

时间:2014-09-10 09:27:43

标签: python tkinter grid pack

我是Python新手,使用包布局时遇到问题。我有40个字母,我想制作4行,每行包含10个字母。

这是我的代码:

import random
from tkinter import *    

root = Tk()

w = Label(root, text="GAME")
w.pack(side=TOP)

# there are 40 tiles
tiles_letter = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'e', 'f', 'f', 'g', 'g', 'h', 'i', 'j', 'k', 'k', 'a', 'b', 'c', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'e', 'f', 'f', 'g', 'g', 'h', 'i', 'j', 'k', 'k']

tiles_make_word = []

def add_letter():
    if not tiles_letter:
        return
    rand = random.choice(tiles_letter)
    tiles_make_word.append(rand)
    print(len(tiles_make_word))
    tile_frame_column = Label(root, text=rand, bg="red", fg="white")
    tile_frame_column.pack(side=LEFT, padx=5, pady=10)
    tiles_letter.remove(rand)  # remove that tile from list of tiles
    if len(tiles_make_word) % 10 == 0:
        separator = Frame(height=100)
        separator.pack(fill=X, padx=5, pady=5)
    root.after(500, add_letter)

root.after(500, add_letter)

root.mainloop()

问题是在每10个字母之后它会创建一个新行,但它没有正确布局。它看起来更像是锯齿形或对角线,而不是直接位于上面的行下方。有人可以告诉我代码有什么问题以及如何解决它?我试图使用“after”方法创建新行时感到困惑。也许错误与此有关。希望这很简单。我已经被困在这几个小时了。

由于

1 个答案:

答案 0 :(得分:1)

试试这个。

问题是您创建了许多窗口小部件并将其打包到root,而我们可以创建一个包含框架的frameContainer。所以我们将标签添加到新框架中。

import random
from Tkinter import *

root = Tk()

w = Label(root, text="GAME")
w.pack(side=TOP)
frameContainer=[]
frameContainer.append(Frame(root,height=100))
frameContainer[-1].pack()
# there are 40 tiles
tiles_letter = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'e', 'f', 'f', 'g', 'g', 'h', 'i', 'j', 'k', 'k', 'a', 'b', 'c', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'e', 'f', 'f', 'g', 'g', 'h', 'i', 'j', 'k', 'k']

tiles_make_word = []

def add_letter():
    global frameContainer
    if not tiles_letter:
        return
    rand = random.choice(tiles_letter)
    tiles_make_word.append(rand)
    print(len(tiles_make_word))
    tile_frame_column = Label(frameContainer[-1], text=rand, bg="red", fg="white")
    tile_frame_column.pack(side=LEFT, padx=5, pady=10)
    tiles_letter.remove(rand)  # remove that tile from list of tiles
    print len(tiles_make_word),'***********'
    if len(tiles_make_word) % 10 == 0:
        frameContainer.append(Frame(root,height=100))
        frameContainer[-1].pack()
    root.after(500, add_letter)

root.after(500, add_letter)

root.mainloop()