如何在 Tkinter 中使用网格水平拉伸单元格?
How to stretch cell horizontally using grid in Tkinter?
我正在使用 tkinter 制作简单的 GUI,我想让它变得太简单和酷所以我想在屏幕上填充这个标签 ********** 但没有选项对于 fill
在网格中,就像在包中一样,所以我正在寻找替代方案。
代码如下:
import tkinter
import os
def submit():
os.chdir("/home/samip/forms")
with open(f'{user_val.get()}.txt', 'w') as file:
file.write(f'''Person Details
User: {user_val.get()}
Age: {age_val.get()}
Address: {address_val.get()}
''')
quit()
root = tkinter.Tk()
root.geometry("400x200")
root.maxsize(400, 200)
root.minsize(400, 200)
root.title("Mars form")
lab = tkinter.Label(text="Mars Form", font=("Arial", 15, "bold"), bg="orange", fg="white", padx=10)
lab.grid()
user = tkinter.Label(text="Name:")
age = tkinter.Label(text="Age:")
address = tkinter.Label(text="Address:")
user.grid()
age.grid()
address.grid()
user_val = tkinter.StringVar()
age_val = tkinter.StringVar()
address_val = tkinter.StringVar()
user_val_entry = tkinter.Entry(root, textvariable=user_val)
age_val_entry = tkinter.Entry(root, textvariable=age_val)
address_val_entry = tkinter.Entry(root, textvariable=address_val)
user_val_entry.grid(row=1, column=1)
age_val_entry.grid(row=2, column=1)
address_val_entry.grid(row=3, column=1)
tkinter.Button(root, text="Submit", command=submit).grid(row=4, column=1)
root.mainloop()
我要填写的标签在第 24 行。
您正在搜索 columnspan 和 sticky:
import tkinter
import os
def submit():
os.chdir("/home/samip/forms")
with open(f'{user_val.get()}.txt', 'w') as file:
file.write(f'''Person Details
User: {user_val.get()}
Age: {age_val.get()}
Address: {address_val.get()}
''')
quit()
root = tkinter.Tk()
root.geometry("400x200")
root.maxsize(400, 200)
root.minsize(400, 200)
root.title("Mars form")
lab = tkinter.Label(text="Mars Form", font=("Arial", 15, "bold"), bg="orange", fg="white", padx=10)
lab.grid(columnspan=2, sticky='ew')
user = tkinter.Label(text="Name:")
age = tkinter.Label(text="Age:")
address = tkinter.Label(text="Address:")
user.grid()
age.grid()
address.grid()
user_val = tkinter.StringVar()
age_val = tkinter.StringVar()
address_val = tkinter.StringVar()
user_val_entry = tkinter.Entry(root, textvariable=user_val)
age_val_entry = tkinter.Entry(root, textvariable=age_val)
address_val_entry = tkinter.Entry(root, textvariable=address_val)
user_val_entry.grid(row=1, column=1)
age_val_entry.grid(row=2, column=1)
address_val_entry.grid(row=3, column=1)
tkinter.Button(root, text="Submit", command=submit).grid(row=4, column=1)
root.mainloop()
这一行(25)在这里:
lab.grid(columnspan=2, sticky='ew')
我使用 columnspan
告诉 tkinter 合并给定数字 中的列。
sticky
告诉 tkinter 这个小部件 坚持 'ew' 东和西 。你会发现带有 sticky='nsew'
的代码表示 东西南北 .
并出docs:
-columnspan n
Insert the slave so that it occupies n columns in the grid. The default is one column, unless the window name is followed by a -, in
which case the columnspan is incremented once for each immediately
following -.
-sticky style
If a slave's cell is larger than its requested dimensions, this option may be used to position (or stretch) the slave within its cell.
Style is a string that contains zero or more of the characters n, s, e
or w. The string can optionally contains spaces or commas, but they
are ignored. Each letter refers to a side (north, south, east, or
west) that the slave will “stick” to. If both n and s (or e and w) are
specified, the slave will be stretched to fill the entire height (or
width) of its cavity. The -sticky option subsumes the combination of
-anchor and -fill that is used by pack. The default is “”, which causes the slave to be centered in its cavity, at its requested size.
更新
您的后续问题是:
It worked to some extend but I was look for alternative for fill the
columnspan only takes effect with 2 I tried other values but others
have no effect
根据您的代码,您最好的选择是使用 grid_columnconfigure(*column, *weight)
tkinter 的方法。
可以找到完美的解释 .
为什么这是您的最佳选择?
就因为你用了tkinter的geometry方法。
那么它是如何工作的呢?
tkinter 会自行计算 window 的大小,如果开发人员没有预定义任何内容。因此,您也可以只删除几何方法的行以产生类似的效果。
但是由于您已经预定义了您构建的几何体 space。 tkinter 的 grid 方法也会根据它包含的最大 widget 自动计算一列或一行的大小。因此,如果您拥有的最大小部件是 configured (width=100)
并且宽度以像素为单位定义,您将获得每个 column 宽度 为 100 像素。与 row 和 height
.
相同
这就是为什么你需要使用 tkinter 的 grid_columnconfigure
方法。
简而言之,如果 space.
为空,此方法告诉 tkinter 哪个小部件具有获取 space 的优先级
可以在下面找到我编辑的完整示例:
- 根列配置。
- 将您的按钮绑定到一个变量。
- 将网格方法与变量分开。因为每一种方法
returns 东西。
- 编辑了网格参数使其以
(column=0, columnspan=2)
居中
import tkinter
import os
def submit():
os.chdir("/home/samip/forms")
with open(f'{user_val.get()}.txt', 'w') as file:
file.write(f'''Person Details
User: {user_val.get()}
Age: {age_val.get()}
Address: {address_val.get()}
''')
quit()
root = tkinter.Tk()
root.geometry("400x200")
root.maxsize(400, 200)
root.minsize(400, 200)
root.title("Mars form")
lab = tkinter.Label(text="Mars Form", font=("Arial", 15, "bold"), bg="orange", fg="white", padx=10)
lab.grid(columnspan=2, sticky='ew')
root.columnconfigure(0, weight=1)
user = tkinter.Label(text="Name:")
age = tkinter.Label(text="Age:")
address = tkinter.Label(text="Address:")
user.grid()
age.grid()
address.grid()
user_val = tkinter.StringVar()
age_val = tkinter.StringVar()
address_val = tkinter.StringVar()
user_val_entry = tkinter.Entry(root, textvariable=user_val)
age_val_entry = tkinter.Entry(root, textvariable=age_val)
address_val_entry = tkinter.Entry(root, textvariable=address_val)
user_val_entry.grid(row=1, column=1)
age_val_entry.grid(row=2, column=1)
address_val_entry.grid(row=3, column=1)
b1 = tkinter.Button(root, text="Submit", command=submit)
b1.grid(row=4, ,column=0, columnspan=2)
root.mainloop()
现在你应该知道tkinter网格方法的所有基本信息了。玩得开心!
我正在使用 tkinter 制作简单的 GUI,我想让它变得太简单和酷所以我想在屏幕上填充这个标签 ********** 但没有选项对于 fill
在网格中,就像在包中一样,所以我正在寻找替代方案。
代码如下:
import tkinter
import os
def submit():
os.chdir("/home/samip/forms")
with open(f'{user_val.get()}.txt', 'w') as file:
file.write(f'''Person Details
User: {user_val.get()}
Age: {age_val.get()}
Address: {address_val.get()}
''')
quit()
root = tkinter.Tk()
root.geometry("400x200")
root.maxsize(400, 200)
root.minsize(400, 200)
root.title("Mars form")
lab = tkinter.Label(text="Mars Form", font=("Arial", 15, "bold"), bg="orange", fg="white", padx=10)
lab.grid()
user = tkinter.Label(text="Name:")
age = tkinter.Label(text="Age:")
address = tkinter.Label(text="Address:")
user.grid()
age.grid()
address.grid()
user_val = tkinter.StringVar()
age_val = tkinter.StringVar()
address_val = tkinter.StringVar()
user_val_entry = tkinter.Entry(root, textvariable=user_val)
age_val_entry = tkinter.Entry(root, textvariable=age_val)
address_val_entry = tkinter.Entry(root, textvariable=address_val)
user_val_entry.grid(row=1, column=1)
age_val_entry.grid(row=2, column=1)
address_val_entry.grid(row=3, column=1)
tkinter.Button(root, text="Submit", command=submit).grid(row=4, column=1)
root.mainloop()
我要填写的标签在第 24 行。
您正在搜索 columnspan 和 sticky:
import tkinter
import os
def submit():
os.chdir("/home/samip/forms")
with open(f'{user_val.get()}.txt', 'w') as file:
file.write(f'''Person Details
User: {user_val.get()}
Age: {age_val.get()}
Address: {address_val.get()}
''')
quit()
root = tkinter.Tk()
root.geometry("400x200")
root.maxsize(400, 200)
root.minsize(400, 200)
root.title("Mars form")
lab = tkinter.Label(text="Mars Form", font=("Arial", 15, "bold"), bg="orange", fg="white", padx=10)
lab.grid(columnspan=2, sticky='ew')
user = tkinter.Label(text="Name:")
age = tkinter.Label(text="Age:")
address = tkinter.Label(text="Address:")
user.grid()
age.grid()
address.grid()
user_val = tkinter.StringVar()
age_val = tkinter.StringVar()
address_val = tkinter.StringVar()
user_val_entry = tkinter.Entry(root, textvariable=user_val)
age_val_entry = tkinter.Entry(root, textvariable=age_val)
address_val_entry = tkinter.Entry(root, textvariable=address_val)
user_val_entry.grid(row=1, column=1)
age_val_entry.grid(row=2, column=1)
address_val_entry.grid(row=3, column=1)
tkinter.Button(root, text="Submit", command=submit).grid(row=4, column=1)
root.mainloop()
这一行(25)在这里:
lab.grid(columnspan=2, sticky='ew')
我使用 columnspan
告诉 tkinter 合并给定数字 中的列。
sticky
告诉 tkinter 这个小部件 坚持 'ew' 东和西 。你会发现带有 sticky='nsew'
的代码表示 东西南北 .
并出docs:
-columnspan n Insert the slave so that it occupies n columns in the grid. The default is one column, unless the window name is followed by a -, in which case the columnspan is incremented once for each immediately following -.
-sticky style If a slave's cell is larger than its requested dimensions, this option may be used to position (or stretch) the slave within its cell. Style is a string that contains zero or more of the characters n, s, e or w. The string can optionally contains spaces or commas, but they are ignored. Each letter refers to a side (north, south, east, or west) that the slave will “stick” to. If both n and s (or e and w) are specified, the slave will be stretched to fill the entire height (or width) of its cavity. The -sticky option subsumes the combination of -anchor and -fill that is used by pack. The default is “”, which causes the slave to be centered in its cavity, at its requested size.
更新
您的后续问题是:
It worked to some extend but I was look for alternative for fill the columnspan only takes effect with 2 I tried other values but others have no effect
根据您的代码,您最好的选择是使用 grid_columnconfigure(*column, *weight)
tkinter 的方法。
可以找到完美的解释
为什么这是您的最佳选择? 就因为你用了tkinter的geometry方法。 那么它是如何工作的呢?
tkinter 会自行计算 window 的大小,如果开发人员没有预定义任何内容。因此,您也可以只删除几何方法的行以产生类似的效果。
但是由于您已经预定义了您构建的几何体 space。 tkinter 的 grid 方法也会根据它包含的最大 widget 自动计算一列或一行的大小。因此,如果您拥有的最大小部件是 configured (width=100)
并且宽度以像素为单位定义,您将获得每个 column 宽度 为 100 像素。与 row 和 height
.
这就是为什么你需要使用 tkinter 的 grid_columnconfigure
方法。
简而言之,如果 space.
可以在下面找到我编辑的完整示例:
- 根列配置。
- 将您的按钮绑定到一个变量。
- 将网格方法与变量分开。因为每一种方法
returns 东西。
- 编辑了网格参数使其以
(column=0, columnspan=2)
居中
import tkinter
import os
def submit():
os.chdir("/home/samip/forms")
with open(f'{user_val.get()}.txt', 'w') as file:
file.write(f'''Person Details
User: {user_val.get()}
Age: {age_val.get()}
Address: {address_val.get()}
''')
quit()
root = tkinter.Tk()
root.geometry("400x200")
root.maxsize(400, 200)
root.minsize(400, 200)
root.title("Mars form")
lab = tkinter.Label(text="Mars Form", font=("Arial", 15, "bold"), bg="orange", fg="white", padx=10)
lab.grid(columnspan=2, sticky='ew')
root.columnconfigure(0, weight=1)
user = tkinter.Label(text="Name:")
age = tkinter.Label(text="Age:")
address = tkinter.Label(text="Address:")
user.grid()
age.grid()
address.grid()
user_val = tkinter.StringVar()
age_val = tkinter.StringVar()
address_val = tkinter.StringVar()
user_val_entry = tkinter.Entry(root, textvariable=user_val)
age_val_entry = tkinter.Entry(root, textvariable=age_val)
address_val_entry = tkinter.Entry(root, textvariable=address_val)
user_val_entry.grid(row=1, column=1)
age_val_entry.grid(row=2, column=1)
address_val_entry.grid(row=3, column=1)
b1 = tkinter.Button(root, text="Submit", command=submit)
b1.grid(row=4, ,column=0, columnspan=2)
root.mainloop()
现在你应该知道tkinter网格方法的所有基本信息了