【问题标题】:tkinter: how to use pack layouttkinter:如何使用包布局
【发布时间】:2014-09-10 09:27:43
【问题描述】:

我是 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”方法创建新行。也许错误与此有关。希望这很简单。我已经坚持了好几个小时了。

谢谢

【问题讨论】:

    标签: python tkinter grid pack


    【解决方案1】:

    试试这个。

    问题是您创建了许多小部件并将其打包到根目录,而不是我们可以创建一个包含框架的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()
    

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2011-06-14
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多