Python Tkinter - 设置 Entry 网格宽度为 100%

11 投票
2 回答
45362 浏览
提问于 2025-04-18 14:41

当我在网格中创建了一个 按钮 + 输入框 + 按钮 时,发现输入框 entry 是居中的,但没有完全填满整个列。我该如何让 Entry 填满这整列呢?

在这里输入图片描述

# Python 3.4.1

import io
import requests
import tkinter as tk
from PIL import Image, ImageTk

def get_image():
    im = requests.get('http://lorempixel.com/' + str(random.randint(300, 400)) + '/' + str(random.randint(70, 120)) + '/')
    return Image.open(io.BytesIO(im.content))


class ImageSelect(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)

        master.resizable(width=False, height=False)
        master.title('Image manager')
        master.iconify = False
        master.deiconify = False
        master.grab_set = True

        image = ImageTk.PhotoImage(get_image())
        self.image = tk.Label(image=image)
        self.image.image = image
        self.image.grid(row=0, columnspan=3)


        self.reload = tk.Button(text='Reload').grid(row=1, column=0, sticky='w')
        self.path = tk.Entry().grid(row=1, column=1, sticky='we')
        self.submit = tk.Button(text='Submit').grid(row=1, column=2, sticky='e')

root = tk.Tk()
app = ImageSelect(master=root)
app.mainloop()

2 个回答

4

一个 Entry 组件的宽度是通过 width 属性来定义的。这个宽度是以字符的数量来计算的。根据我所知道的,没有简单的方法可以让 Entry 自动调整大小以适应空间。你可以这样设置宽度(默认是20个字符):

self.path = tk.Entry(width=28).grid(row=1, column=1, sticky='we')

如果你真的想让 Entry 自动变大或变小,你可以把一个事件绑定到窗口大小变化上,这样就可以重新计算并设置 Entry 需要的宽度,但这样做可能会有点麻烦。

30

使用 grid() 的时候,你可以在 Entry 的父级上使用 grid_columnconfigure()

import tkinter as tk

root = tk.Tk()

tk.Entry(root).grid(sticky='we')
root.grid_columnconfigure(0, weight=1)

root.mainloop()

如果你用 pack(),可以设置 fill='x' 来让它填满横向空间

import tkinter as tk

root = tk.Tk()

tk.Entry(root).pack(fill='x')

root.mainloop()

顺便说一下:使用:

self.path = tk.Entry().grid()

你把 grid() 的结果赋值给 self.path,但其实 grid() 总是返回 None

如果你需要 self.path,那么可以这样做:

self.path = tk.Entry()
self.path.grid()

如果你不需要 self.path,那么可以这样做:

tk.Entry().path.grid()

撰写回答