【问题标题】:How to stretch cell horizontally using grid in Tkinter?如何在 Tkinter 中使用网格水平拉伸单元格?
【发布时间】:2020-11-10 20:28:22
【问题描述】:

我正在使用 tkinter 制作简单的 GUI,我想让它变得过于简单和酷,所以我想在屏幕上填写这个标签 **********,但没有 @ 选项987654321@ 在网格中,就像在包中一样,所以我正在寻找替代方案。

代码如下:

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 行。

【问题讨论】:

  • 你在Entry的配置中试过width吗?
  • 我认为这需要澄清,因为该选项的名称有点误导。 widthLabelButton 以及 Entry 不同。对于前 2,它将宽度设置为 像素、厘米、英寸、点数 if LabelButton 包含图像 某种形式,否则它将宽度设置为字符数。相比之下,Entry only 将宽度设置为 字符数。在任何一种情况下,将width 设置为< 0 都会使小部件缩小到包含内容的最小尺寸。

标签: python python-3.x user-interface tkinter grid-layout


【解决方案1】:

您正在搜索列跨度和粘性:

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 插入从属,使其占据网格中的 n 列。默认为一列,除非窗口名称后跟 -,在 在这种情况下,columnspan 立即每增加一次 跟随 -.

-粘性样式 如果从属的单元格大于其请求的尺寸,则此选项可用于在其单元格内定位(或拉伸)从属单元。 样式是包含零个或多个字符 n、s、e 的字符串 或 w。字符串可以选择包含空格或逗号,但它们 被忽略。每个字母指的是一侧(北、南、东或 西),奴隶将“坚持”。如果 n 和 s(或 e 和 w)都是 指定,从属将被拉伸以填充整个高度(或 宽度)其腔。 -sticky 选项包含以下组合 包使用的-anchor 和-fill。默认值为“”,这会导致从属设备以其请求的大小在其空腔中居中。

更新

你的问题是:

它在一定程度上起作用,但我正在寻找替代品来填充 columnspan 仅对 2 生效我尝试了其他值但其他值 没有效果

根据您的代码,您最好的选择是使用grid_columnconfigure(*column, *weight) tkinter 方法。 可以在here找到完美的解释。

为什么这是您的最佳选择? 只是因为你使用了 tkinter 的几何方法。 那么它是如何工作的呢?

如果开发人员没有预先定义任何内容,tkinter 会自行计算窗口的大小。因此,您也可以只删除几何方法的线条以获得类似的效果。

但是由于您已经预先定义了几何图形,因此您已经构建了空间。 tkinter 的 grid 方法还通过它包含的最大小部件自动计算列或行的大小。因此,如果您拥有的最大小部件是 configured(width=100) 并且宽度以像素为单位定义,您将获得每个 columnwidth 100 像素。与 heightrow 相同。

这就是为什么你需要使用 tkinter 的 grid_columnconfigure 方法。 简而言之,这个方法告诉 tkinter 如果有空的空间,哪个小部件具有获取空间的优先级。

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

  1. 根列配置。
  2. 将您的按钮绑定到一个变量。
  3. 将网格方法与变量分开。因为每一种方法 返回一些东西。 more
  4. 编辑了网格参数,使其以(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 网格方法的所有基本信息 abel to work your GUI out。玩得开心!

【讨论】:

  • 它在某种程度上有效,但我正在寻找 fill 的替代品 columnspan 仅在 2 时生效,我尝试了其他值但其他值无效,请帮助我。
  • @SamipKarki 我为你更新了我的答案。如果您接受我的回答,我将不胜感激。
猜你喜欢
  • 2022-01-23
  • 2012-11-05
  • 2014-11-18
  • 2012-04-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多