我是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”方法创建新行时感到困惑。也许错误与此有关。希望这很简单。我已经被困在这几个小时了。
由于
答案 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()