Tkinter组件位置异常:点击添加按钮后Entry控件布局错乱
Tkinter动态新增控件布局错乱问题解决
问题原因
点击“Add more site”后控件位置偏移、布局错乱,核心原因是:
- 新增Entry时未指定
row参数,grid布局自动将控件分配到第一个空行,导致和现有控件重叠、错位。 - 没有跟踪当前最后一行的位置,无法保证新增控件在已有控件下方依次排列。
解决办法
- 定义全局变量记录当前最后一行的行号,初始值设为现有控件的最后一行+1(现有控件最后一行是row6,所以初始为7)。
- 在新增控件时,明确指定
row为当前记录的行号,放置完成后将行号递增,确保下次新增在最下方。 - 可选:用列表存储动态创建的控件,方便后续操作(如获取输入值)。
修改后的完整代码
import tkinter as tk from tkinter import ttk import requests import time from tkinter import messagebox window = tk.Tk() window.geometry('400x700') window.title("SiteChecker") # 记录当前最后一行的行号,现有控件最后一行是row6,初始为7 current_row = 7 def clicked(): global current_row # 新增链接输入框,对齐到column0,当前行 txt = tk.Entry(window, width=18) txt.grid(column=0, row=current_row, pady=8) # 新增时间输入框,对齐到column1,当前行 tim = tk.Entry(window, width=3) tim.grid(column=1, row=current_row, pady=8) # 行号递增,为下次新增做准备 current_row += 1 # 标题标签 lbl1 = tk.Label(window, text="Enter links: ") lbl1.grid(column=0, row=1) lbl2 = tk.Label(window, text="Enter the test time: ") lbl2.grid(column=1, row=1) lbl3 = tk.Label(window, text="Availability status ") lbl3.grid(column=2, row=1) # 初始输入框 txt1 = tk.Entry(window,width=18) txt1.grid(column=0, row=2, pady=8) txt2 = tk.Entry(window,width=18) txt2.grid(column=0, row=3,pady=8) txt3 = tk.Entry(window,width=18) txt3.grid(column=0, row=4,pady=8) txt4 = tk.Entry(window,width=18) txt4.grid(column=0, row=5,pady=8) txt5 = tk.Entry(window,width=18) txt5.grid(column=0, row=6,pady=8) tim1 = tk.Entry(window,width=3) tim1.grid(column=1, row=2, pady=8) tim2 = tk.Entry(window,width=3) tim2.grid(column=1, row=3, pady=8) tim3 = tk.Entry(window,width=3) tim3.grid(column=1, row=4, pady=8) tim4 = tk.Entry(window,width=3) tim4.grid(column=1, row=5, pady=8) tim5 = tk.Entry(window,width=3) tim5.grid(column=1, row=6, pady=8) btn = tk.Button(window, text="Add more site", command=clicked) btn.grid(column=1, row=0) window.mainloop()
扩展优化(可选)
如果需要后续获取动态新增控件的输入值,可以用列表存储这些控件:
# 初始化列表,存储每个新增的(链接输入框, 时间输入框)对 dynamic_entries = [] def clicked(): global current_row txt = tk.Entry(window, width=18) txt.grid(column=0, row=current_row, pady=8) tim = tk.Entry(window, width=3) tim.grid(column=1, row=current_row, pady=8) # 将控件加入列表 dynamic_entries.append((txt, tim)) current_row += 1 # 示例:获取所有动态控件的值 def get_all_values(): for link_entry, time_entry in dynamic_entries: link = link_entry.get() test_time = time_entry.get() print(f"链接: {link}, 测试时间: {test_time}")
内容的提问来源于stack exchange,提问作者EvgeniyMEV
相关产品推荐
相关产品推荐

