Tkinter组件不显示问题咨询:指定标签为何未正常渲染?
Tkinter组件显示异常问题分析
我正在尝试制作一个非常简单的Tkinter应用,但始终无法理解为何其中一个组件无法显示。以下代码本应在按钮-标签对的上方一行渲染字符串'30',但实际仅显示按钮-标签对,未出现额外字符串。如果我将显示'30'的标签代码移至makebutton()下方,标签会显示出来,但会覆盖底部的按钮。请问我在理解上存在什么误区?
from tkinter import * from tkinter import ttk data = { 'projects': { 'project': { 'name': 'Project', 'starttime': 0 }, 'another': { 'name': 'Another', 'starttime': 0 } }, 'clock': { 'clockedin?': False, 'time': 30 } } def makebutton(): row = 1 for item in data['projects']: ttk.Button(frm, text=data['projects'][item]['name']).grid(column=0,row=row) ttk.Label(frm, text=data['projects'][item]['starttime']).grid(column=1, row=row) row = row + 1 root = Tk() frm = ttk.Frame(root, padding=10) frm.grid() ttk.Label(frm, text=data['clock']['time']).grid(column=0, row=2) # should say '30' makebutton() root.mainloop()
问题根源
核心是grid布局的行号冲突:
- 你先给显示'30'的标签设置了
row=2,随后调用makebutton()时,函数从row=1开始创建组件,循环两次后,第二组按钮-标签会被放在row=2的位置,直接覆盖了之前的'30'标签,导致它无法显示。 - 若把标签代码移到
makebutton()之后,此时函数已经占用了row=1和row=2,再给标签设row=2就会和第二组按钮-标签重叠。
解决方案
方案1:调整标签行号
把'30'标签的行号改为row=0,让它处于所有按钮-标签对的最上方,避免被覆盖:
ttk.Label(frm, text=data['clock']['time']).grid(column=0, row=0) # 修改row为0
方案2:动态获取起始行号
在makebutton()函数中,通过frm.grid_size()[1]获取当前框架已使用的总行数,以此作为起始行号,避免硬编码行号导致冲突:
def makebutton(): row = frm.grid_size()[1] # 获取当前已用行的下一行 for item in data['projects']: ttk.Button(frm, text=data['projects'][item]['name']).grid(column=0,row=row) ttk.Label(frm, text=data['projects'][item]['starttime']).grid(column=1, row=row) row += 1
这种方式不管组件创建顺序如何,都不会出现行号重叠问题。
内容的提问来源于stack exchange,提问作者Sjiveru
相关产品推荐
相关产品推荐

