如何在 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 像素。与 rowheight.

相同

这就是为什么你需要使用 tkinter 的 grid_columnconfigure 方法。 简而言之,如果 space.

为空,此方法告诉 tkinter 哪个小部件具有获取 space 的优先级

可以在下面找到我编辑的完整示例:

  1. 根列配置。
  2. 将您的按钮绑定到一个变量。
  3. 将网格方法与变量分开。因为每一种方法 returns 东西。
  4. 编辑了网格参数使其以 (column=0, columnspan=2)
  5. 居中

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网格方法的所有基本信息了。玩得开心!