Python 使用网格在框架中创建标签

Python 使用网格在框架中创建标签,python,tkinter,grid,frame,Python,Tkinter,Grid,Frame,我在这方面已经坚持了很长时间,我做了很多研究,但没有发现任何太有用的东西 我试图在我的框架中放置由字母“a”-“j”组成的标签。每隔几秒钟,我希望下一个字母与上一个字母相邻。但是,每隔几秒钟,新的字母就会替换上一个字母——这意味着我再也看不到旧的字母了。我试了很多东西,但都没用。有人能帮忙吗 我曾尝试在父框架内的框架内对所有标签进行网格布局,但这对我来说太复杂了。有办法解决这个问题吗 from tkinter import * from ttk import * import random r

我在这方面已经坚持了很长时间,我做了很多研究,但没有发现任何太有用的东西

我试图在我的框架中放置由字母“a”-“j”组成的标签。每隔几秒钟,我希望下一个字母与上一个字母相邻。但是,每隔几秒钟,新的字母就会替换上一个字母——这意味着我再也看不到旧的字母了。我试了很多东西,但都没用。有人能帮忙吗

我曾尝试在父框架内的框架内对所有标签进行网格布局,但这对我来说太复杂了。有办法解决这个问题吗

from tkinter import *
from ttk import *
import random

root = Tk()

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

tiles_make_word = []

content = Frame(root)
frame = Frame(content, borderwidth=5, relief="ridge", width=200, height=300)
namelbl = Label(content, text="Enter words: ")
name = Entry(content)

ok = Button(content, text="Okay")
cancel = Button(content, text="Cancel")

content.grid(column=0, row=0)
frame.grid(column=0, row=0, columnspan=12, rowspan=12)
namelbl.grid(column=0, row=12)
name.grid(column=1, row=12, columnspan=2)

ok.grid(column=12, row=0)
cancel.grid(column=13, row=0)

def add_letter():
    global i
    i=0
    if not tiles_letter:
        return
    rand = random.choice(tiles_letter)
    tiles_make_word.append(rand)
    tile_frame_column = Label(content, text=rand)
    tile_frame_column.grid(column=i, row=0)
    tiles_letter.remove(rand)  # remove that tile from list of tiles
    i=i+1
    root.after(2000, add_letter)

root.after(2000, add_letter)

root.mainloop()

问题在于您使用的变量
i
,不是每次它都替换标签,而是每次它都将标签放在相同的位置,有效地覆盖了旧标签。这是因为您在函数add_letter中设置了
i=0
,您需要将其取出,如果使用globals,则在两个位置都设置
global i
,即

global i
i=0
def add_letter():
    global i
    i+=1
然而,这也不理想,因为字母之间的空间很大(由于底部的小部件)。我建议使用
.place(x=…,y=…)
来克服这个问题,但这意味着您必须在任何地方都使用
.place()
,因此需要对代码进行大的更改

编辑:这里是使用
.place()
重新处理的代码使用:

from tkinter import *
import random

root = Tk()

root.geometry("350x300")
# there are 10 tiles
tiles_letter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

tiles_make_word = []

namelbl = Label(root, text="Enter words: ")
name = Entry(root)

ok = Button(root, text="Okay")
cancel = Button(root, text="Cancel")

namelbl.place(x=35, y=200)
name.place(x=110, y=200, width=100)

ok.place(x=200, y=100)
cancel.place(x=250, y=100)

global i
i=35

def add_letter():
    global i    
    if not tiles_letter:
        return
    rand = random.choice(tiles_letter)
    tiles_make_word.append(rand)
    tile_frame_column = Label(root, text=rand)
    tile_frame_column.place(x=i, y=50)
    tiles_letter.remove(rand)  # remove that tile from list of tiles
    i+=10
    root.after(2000, add_letter)

root.after(2000, add_letter)

谢谢你的帮助!你认为在我的情况下使用位置、网格或包更容易吗?我认为网格在我的情况下是最简单的,似乎place()可能是我想把字母放在特定区域的选项。你能换一下吗?再次感谢您的投入。非常感谢!期待。(你救了我的命:))好的,我已经为你完成了代码,很抱歉花了一段时间,这并不是非常惊人,但你可以轻松地对它进行个性化设置!谢谢,太棒了!别担心,你帮了我的忙。我永远感激你。