简体   繁体   中英

Tkinter's grid() geometry manager ignoring ipadx argument

While extending the code based on this awesome Bryan Oakley's answer (btw his code works great, it's just me the one that can't make the padding work) I've found that the argument ipadx passed to .grid() is being ignored on the line:

e.grid(row=row, column=column, sticky=tk.N+tk.E+tk.S+tk.W, ipadx=5, ipady=3)

from the following script:

import tkinter as tk
from tkinter import ttk

class SimpleTableInput(tk.Frame):
    def __init__(self, parent, rows, columns):
        tk.Frame.__init__(self, parent)

        self._entry = {}
        self.rows = rows
        self.columns = columns

        # create the table of widgets
        for row in range(self.rows):
            for column in range(self.columns):
                index = (row, column)
                e = ttk.Entry(self, justify='right')
                e.grid(row=row, column=column, sticky=tk.N+tk.E+tk.S+tk.W, ipadx=5, ipady=3)
                #e.grid(row=row, column=column, sticky="nsew", ipadx=5, ipady=3)
                self._entry[index] = e
        # adjust column weights so they all expand equally
        for column in range(self.columns):
            self.grid_columnconfigure(column, weight=1)
        # designate a final, empty row to fill up any extra space
        self.grid_rowconfigure(rows, weight=1)

    def get(self):
        '''Return a list of lists, containing the data in the table'''
        result = []
        for row in range(self.rows):
            current_row = []
            for column in range(self.columns):
                index = (row, column)
                #current_row.append(self._entry[index].get())
                current_row.append(self._entry[index].get())
            result.append(current_row)
        return result

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.table = SimpleTableInput(self, 3, 4)
        self.submit = ttk.Button(self, text="Submit", command=self.on_submit)
        self.table.pack(side="top", fill="both", expand=True)
        self.submit.pack(side="bottom")

    def on_submit(self):
        print(self.table.get())


root = tk.Tk()
Example(root).pack(side="top", fill="both", expand=True)
root.mainloop()

So I end up getting no internal padding on the entry widgets, they align the text to the right but leave no space before the ttk.Entry border as can be seen on this image: ttk.Entry widgets with no internal x padding

One thing that amazes me is that ipady works ok.

Things I've tried:

  • tk.Entry instead of ttk.Entry
  • different values for ipadx (makes no difference at all)
  • read the docs to find if another argument could be interfering with ipadx, found nothing (however I regard this as the most probable cause)

If it's of any help, I'm using Tkinter version 8.6 and Python 3.6.2 on windows 7

The Entry widget does not take into account the ipadx , but tk.Label does, so it is widget dependent.

However, there is another way to add padding inside a ttk.Entry by using a style, with style.configure('padded.TEntry', padding=[<left>, <top>, <right>, <bottom>]) :

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style(root)
style.configure('padded.TEntry', padding=[5, 3, 5, 3])

e = ttk.Entry(root, justify='right', style='padded.TEntry')
e.grid()
root.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM