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

如何使用Python Tkinter正确将输入框放置在标签旁?

解决Tkinter输入框无法紧贴标签、位置错乱的问题

问题根源

  1. 输入框未绑定父容器:你的ttk.Entry()没有指定父组件,导致输入框默认挂载到主窗口而非frame1,这是位置错乱的核心原因。
  2. grid布局默认间距与对齐问题:未设置padx/pady控制组件间距,也未用sticky参数让标签和输入框对齐,导致两者间距过大。

修复方案

修改后的完整代码(关键修改处已标注):

from tkinter import *
from tkinter import ttk
import tkinter as tk
from tkinter import Tk


class Window(Tk):
    is_reset = True

    def __init__(self):
        super().__init__()
        self.geometry("720x465+760+200")
        self.resizable(True, True)
        self.title("Калькулятор СМО")
        # 注:如果图标文件不存在,需注释或替换路径
        # self.icon = PhotoImage(file="smile.png")
        # self.iconphoto(False, self.icon)

        self.notebook = ttk.Notebook(self)  # 给notebook指定父组件
        self.notebook.grid(row=0, column=0, sticky="nsew")  # 设置sticky让notebook填满窗口

        # 配置主窗口的grid权重,让notebook自适应窗口大小
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.frame1 = ttk.Frame(self.notebook)
        self.frame2 = ttk.Frame(self.notebook)
        self.frame3 = ttk.Frame(self.notebook)
        
        # 移除不必要的frame grid调用,notebook会自动管理子frame显示
        # self.frame1.grid()
        # self.frame2.grid()
        # self.frame3.grid()
        
        self.notebook.add(self.frame1, text="Одноканальна СМО з відмовами")
        self.notebook.add(self.frame2, text="Багатоканальна СМО з відмовами")
        self.notebook.add(self.frame3, text="Одноканальна СМО з очікуванням з обмеженою чергою")

        # 配置frame1的grid权重,让内部组件自适应frame大小
        self.frame1.grid_rowconfigure(1, weight=1)
        self.frame1.grid_rowconfigure(2, weight=1)
        self.frame1.grid_columnconfigure(0, weight=1)
        self.frame1.grid_columnconfigure(1, weight=1)


    def make_frame1(self):
        intensity_lambda_label = tk.Label(self.frame1, text="Введіть інтенсивність λ", font=("Helvetica", 14))
        # 设置padx控制左右间距,sticky='w'让标签左对齐
        intensity_lambda_label.grid(column=0, row=1, padx=(10, 5), pady=10, sticky="w")
        # 给Entry指定父组件self.frame1
        intensity_lambda_entry = ttk.Entry(self.frame1)
        # 设置padx控制左右间距,sticky='ew'让输入框填满列宽
        intensity_lambda_entry.grid(column=1, row=1, padx=(5, 10), pady=10, sticky="ew")
        
        intensity_miu_label = tk.Label(self.frame1, text="Введіть інтенсивність μ", font=("Helvetica", 14))
        intensity_miu_label.grid(column=0, row=2, padx=(10, 5), pady=10, sticky="w")
        # 给Entry指定父组件self.frame1
        intensity_miu_entry = ttk.Entry(self.frame1)
        intensity_miu_entry.grid(column=1, row=2, padx=(5, 10), pady=10, sticky="ew")


    def run(self):
        self.make_frame1()
        self.mainloop()


if __name__ == '__main__':
    window = Window()
    window.run()

关键修改说明

  • 给所有ttk.Entry()添加父组件self.frame1,确保输入框在frame1内部布局
  • 给grid()方法添加padx/pady参数,精确控制组件间的间距(数值可根据需求调整)
  • 使用sticky参数:标签设为w左对齐,输入框设为ew让其填满所在列的宽度,同时紧贴标签
  • 配置窗口和frame的grid_rowconfigure/grid_columnconfigure权重,让组件自适应窗口大小
  • 移除了不必要的frame.grid()调用,因为ttk.Notebook会自动管理子frame的显示

内容的提问来源于stack exchange,提问作者arctg30

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:02:23