首页 > 解决方案 > 使用网格(tkinter)时标签超出嵌套框架

问题描述

这只是一个简单的问题,但是当您使用 Sticky 时,标签不应该留在它的嵌套框架内吗?在我的代码中,它只保留在父框架中。如果正常有解决办法吗?

我试过查看文档,但没有找到任何可以帮助的东西。

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Tk test")
root.geometry("800x800")

frame_1 = ttk.Frame(root, relief="sunken", height="400", width="400").grid(row=0, column=0, rowspan=1, columnspan=1)
frame_2 = ttk.Frame(frame_1, relief="sunken", height="200", width="200").grid(row=0, column=0, rowspan=1, columnspan=1)
label_1 = ttk.Label(frame_2, text="Text").grid(row=0, column=0, sticky="N, E")

root.mainloop()

预期结果:标签保留在嵌套在父框架内的框架内。实际结果:它只停留在父框架内

标签: pythontkinter

解决方案


.grid(...)函数None返回。因此,当你这样做

frame_1 = ttk.Frame(root, relief="sunken", height="400", width="400").grid(row=0, column=0, rowspan=1, columnspan=1)

你分配Noneframe_1. frame_2和也是如此label_1

因为frame_1 == None,调用ttk.Frame(frame_1, ...)其实和ttk.Frame(None, ...). 因此,您没有传递主窗口,默认情况下将根窗口作为主窗口。同样,创建label_1.

解决方法是将小部件的创建和放置分成两行:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Tk test")
root.geometry("800x800")

frame_1 = ttk.Frame(root, relief="sunken", height="400", width="400")
frame_1.grid(row=0, column=0, rowspan=1, columnspan=1)
frame_2 = ttk.Frame(frame_1, relief="sunken", height="200", width="200")
frame_2.grid(row=0, column=0, rowspan=1, columnspan=1)
label_1 = ttk.Label(frame_2, text="Text")
label_1.grid(row=0, column=0, sticky="N, E")

root.mainloop()

推荐阅读