Python 使用网格在框架中创建标签
我在这方面已经坚持了很长时间,我做了很多研究,但没有发现任何太有用的东西 我试图在我的框架中放置由字母“a”-“j”组成的标签。每隔几秒钟,我希望下一个字母与上一个字母相邻。但是,每隔几秒钟,新的字母就会替换上一个字母——这意味着我再也看不到旧的字母了。我试了很多东西,但都没用。有人能帮忙吗 我曾尝试在父框架内的框架内对所有标签进行网格布局,但这对我来说太复杂了。有办法解决这个问题吗Python 使用网格在框架中创建标签,python,tkinter,grid,frame,Python,Tkinter,Grid,Frame,我在这方面已经坚持了很长时间,我做了很多研究,但没有发现任何太有用的东西 我试图在我的框架中放置由字母“a”-“j”组成的标签。每隔几秒钟,我希望下一个字母与上一个字母相邻。但是,每隔几秒钟,新的字母就会替换上一个字母——这意味着我再也看不到旧的字母了。我试了很多东西,但都没用。有人能帮忙吗 我曾尝试在父框架内的框架内对所有标签进行网格布局,但这对我来说太复杂了。有办法解决这个问题吗 from tkinter import * from ttk import * import random r
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()可能是我想把字母放在特定区域的选项。你能换一下吗?再次感谢您的投入。非常感谢!期待。(你救了我的命:))好的,我已经为你完成了代码,很抱歉花了一段时间,这并不是非常惊人,但你可以轻松地对它进行个性化设置!谢谢,太棒了!别担心,你帮了我的忙。我永远感激你。