如何在pythontkinter中使用grid方法定位标签?

2024-03-28 12:57:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图把一个大标签在窗口顶部的中间,然后3个选项菜单均匀地分布在它下面。我无法使菜单跨越整个窗口。我不确定我做错的是

root.geometry("800x600")

在底部。所有的东西都是均匀分布的,但都被推到窗户的左边,而不是填满整个东西。我还没有到下一部分,我将绑定函数,这些函数将在每个菜单下显示文本段落,这就是为什么我希望窗口如此大。在

这是我的代码:

^{pr2}$

函数内部的标签,如“1950年代的社会”等,将是大段。在


Tags: 函数代码文本选项菜单root标签社会
2条回答

网格中的默认单元格没有大小。只能使用设置最小大小

root.columnconfigure(0, minsize=300)
root.columnconfigure(1, minsize=300)
root.columnconfigure(2, minsize=300)

要创建大标题,可以连接3个单元格

^{pr2}$

您也可以使用sticky='we'使用widget-to-cell-size

网格(…,sticky='we')

w=west/lefte=east/right

工作示例:

import tkinter as tk

#  - functions  -

def fifties(selection):
    data = {
        "Intro": "1950's intro",
        "Political": "1950's politcal",
        "Economic": "1950's economic",
        "Social": "1950's social", 
        "Technological": "1950's technological",
        "Aesthetic": "1950's aesthetic",
    }

    if selection in data:
        text_1950['text'] = data[selection]
    else:
        text_1950['text'] = "Unknow selection: " + selection 

def sixties(selection):
    data = {
        "Intro": "1960's intro",
        "Political": "1960's politcal",
        "Economic": "1960's economic",
        "Social": "1960's social", 
        "Technological": "1960's technological",
        "Aesthetic": "1960's aesthetic",
    }

    if selection in data:
        text_1960['text'] = data[selection]
    else:
        text_1960['text'] = "Unknow selection: " + selection

def seventies(selection):
    data = {
        "Intro": "1970's intro",
        "Political": "1970's politcal",
        "Economic": "1970's economic",
        "Social": "1970's social", 
        "Technological": "1970's technological",
        "Aesthetic": "1970's aesthetic",
    }

    if selection in data:
        text_1970['text'] = data[selection]
    else:
        text_1970['text'] = "Unknow selection: " + selection

#  - main  -

# - init -
root = tk.Tk()
root.configure(bg="turquoise")
root.geometry("900x600")

# - set columns minimal size -

root.columnconfigure(0, minsize=300)
root.columnconfigure(1, minsize=300)
root.columnconfigure(2, minsize=300)

# - header -

lbl = tk.Label(root, text="Pick a Decade", bg="turquoise", fg="hot pink", font=("Times", 40, "bold italic"))
lbl.grid(column=0, row=0, columnspan=3, sticky='we')

# - menus -

options = ["Intro", "Political", "Economic", "Social", "Technological", "Aesthetic"]

var = tk.StringVar(value="1950's")
a = tk.OptionMenu(root, var, *options, command=fifties)
a.grid(column=0, row=2, sticky='we')

var = tk.StringVar(value="1960's")
a = tk.OptionMenu(root, var, *options, command=sixties)
a.grid(column=1, row=2, sticky='we')

var = tk.StringVar(value="1970's")
a = tk.OptionMenu(root, var, *options, command=seventies)
a.grid(column=2, row=2, sticky='we')

# - empty labels for text -

text_1950 = tk.Label(root, bg="turquoise")
text_1950.grid(column=0, row=3)

text_1960 = tk.Label(root, bg="turquoise")
text_1960.grid(column=1, row=3)

text_1970 = tk.Label(root, bg="turquoise")
text_1970.grid(column=2, row=3)

# - start -
root.mainloop()

enter image description here

grid几何图形管理器需要知道,如果空间超过显示小部件所需的空间,该怎么做。它通过分配相对于每行和每列的“权重”的额外空间来实现这一点。例如,如果一列的权重为3,而另一列的权重为1,则第一列的额外空间将是另一列的3倍。在

默认情况下,行和列的权重为零。这意味着如果有额外的空间,如您的例子中,它将被闲置。在

对于您的问题,最简单的解决方案是给每列一个相等的非零权重,以便使额外的空间均匀分布。您可以使用columnconfigure(或grid_columnconfigure)方法来执行此操作:

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)
root.grid_columnconfigure(2, weight=1)

既然您希望标签跨越所有三列,那么您需要告诉grid,这可以通过将标签放在第0列中并给它一个3的columnspan来实现:

^{pr2}$

相关问题 更多 >