我已经坚持了很长时间,我做了很多研究,但没有发现任何有用的东西。
我正在尝试放置标签 - 由我的框架中的字母'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()
答案 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)