Tkinter 的 grid() 几何管理器忽略 ipadx 参数
Tkinter's grid() geometry manager ignoring ipadx argument
在根据 this awesome Bryan Oakley 的回答扩展代码时(顺便说一句,他的代码工作得很好,只有我不能使填充工作)我发现参数 ipadx 传递给.grid() 在以下行被忽略:
e.grid(row=row, column=column, sticky=tk.N+tk.E+tk.S+tk.W, ipadx=5, ipady=3)
来自以下脚本:
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()
所以我最终在条目小部件上没有内部填充,它们将文本向右对齐,但在 ttk.Entry 边框之前没有留下 space,如图所示:ttk.Entry widgets with no internal x padding
令我惊讶的是ipady工作正常。
我尝试过的事情:
- tk.Entry 而不是 ttk.Entry
- ipadx 的不同值(完全没有区别)
- 阅读文档以查找是否有其他参数可能会干扰 ipadx,但一无所获(但我认为这是最可能的原因)
如果有任何帮助,我在 windows 7
上使用 Tkinter 8.6 版和 Python 3.6.2
Entry
小部件不考虑 ipadx
,但 tk.Label
考虑,因此它依赖于小部件。
但是,还有另一种方法可以通过使用样式在 ttk.Entry
中添加填充,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()
在根据 this awesome Bryan Oakley 的回答扩展代码时(顺便说一句,他的代码工作得很好,只有我不能使填充工作)我发现参数 ipadx 传递给.grid() 在以下行被忽略:
e.grid(row=row, column=column, sticky=tk.N+tk.E+tk.S+tk.W, ipadx=5, ipady=3)
来自以下脚本:
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()
所以我最终在条目小部件上没有内部填充,它们将文本向右对齐,但在 ttk.Entry 边框之前没有留下 space,如图所示:ttk.Entry widgets with no internal x padding
令我惊讶的是ipady工作正常。
我尝试过的事情:
- tk.Entry 而不是 ttk.Entry
- ipadx 的不同值(完全没有区别)
- 阅读文档以查找是否有其他参数可能会干扰 ipadx,但一无所获(但我认为这是最可能的原因)
如果有任何帮助,我在 windows 7
上使用 Tkinter 8.6 版和 Python 3.6.2Entry
小部件不考虑 ipadx
,但 tk.Label
考虑,因此它依赖于小部件。
但是,还有另一种方法可以通过使用样式在 ttk.Entry
中添加填充,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()