框架中的tkinter标签使用网格

时间:2014-09-13 01:44:33

标签: python tkinter grid frame

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

我正在尝试放置标签 - 由我的框架中的字母'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()

1 个答案:

答案 0 :(得分:1)

问题在于您使用的变量i,而不是每次都替换标签,而是每次都将标签放在同一个地方,有效地覆盖旧标签。这是因为您在函数add_letter 中设置i=0 ,您需要将其取出并在两个地方使用全局变量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)