You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter组件位置异常:点击添加按钮后Entry控件布局错乱

Tkinter动态新增控件布局错乱问题解决

问题原因

点击“Add more site”后控件位置偏移、布局错乱,核心原因是:

  • 新增Entry时未指定row参数,grid布局自动将控件分配到第一个空行,导致和现有控件重叠、错位。
  • 没有跟踪当前最后一行的位置,无法保证新增控件在已有控件下方依次排列。

解决办法

  1. 定义全局变量记录当前最后一行的行号,初始值设为现有控件的最后一行+1(现有控件最后一行是row6,所以初始为7)。
  2. 在新增控件时,明确指定row为当前记录的行号,放置完成后将行号递增,确保下次新增在最下方。
  3. 可选:用列表存储动态创建的控件,方便后续操作(如获取输入值)。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:35:17