在Python(Tkinter)中在同一窗口中混合两个布局管理器

在Python(Tkinter)中在同一窗口中混合两个布局管理器,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我对Python和Tkinter还很陌生,所以我希望这个问题对高年级学生来说会很容易 我有一张棋盘: 我使用的是网格布局管理,如下所示: from tkinter import * def checkerboard(can): w = can.winfo_width() h = can.winfo_height() cellwidth = w / 4 cellheight = h / 4 for row in range(4): fo

我对Python和Tkinter还很陌生,所以我希望这个问题对高年级学生来说会很容易

我有一张棋盘:

我使用的是网格布局管理,如下所示:

from tkinter import *

def checkerboard(can):
    w = can.winfo_width()
    h = can.winfo_height()
    cellwidth = w / 4
    cellheight = h / 4

    for row in range(4):
        for col in range(4):
            x1=col * cellwidth
            y1=row * cellheight
            x2=(col + 1) * cellwidth
            y2=(row + 1) * cellheight
            can.create_rectangle(col * cellwidth, row * cellheight, (col + 1) * cellwidth, (row + 1) * cellheight,
                                 fill='white')
            can.create_text(((x1+x2)/2,(y1+y2)/2),text='A')

window = Tk()
thecanvas = Canvas(window, width=500, height=500)
thecanvas.grid(row=0, column=0)
window.update_idletasks()
checkerboard(thecanvas)
window.mainloop()
问题是我想在棋盘上添加上一行,它不属于网格布局。大概是这样的:

我怎样才能做到呢


提前感谢

最好的解决方案是为棋盘创建一个框架,然后您可以在该框架中创建小部件。在主窗口中,可以使用要添加棋盘格和任何其他小部件的任何几何图形管理器


不过,在这种特定情况下,您可以将画布移动到第一行,然后在第0行中添加任何其他内容。

您不使用
grid
创建棋盘格,而使用
grid
仅将画布放在窗口中

Canvas
位于
row=0
中,因此您可以将其置于
row=2
中,然后您可以将
标签置于
row=0
row=1

l1 = Label(window, text="I WANT TO CREATE THIS LABEL")
l1.grid(row=0, column=0)

l2 = Label(window, text="AND THIS TOO", fg='red')
l2.grid(row=1, column=0)

thecanvas = Canvas(window, width=500, height=500)
thecanvas.grid(row=2, column=0)
完整代码

from tkinter import *

def checkerboard(can):
    w = can.winfo_width()
    h = can.winfo_height()
    cellwidth = w / 4
    cellheight = h / 4

    for row in range(4):
        for col in range(4):
            x1=col * cellwidth
            y1=row * cellheight
            x2=(col + 1) * cellwidth
            y2=(row + 1) * cellheight
            can.create_rectangle(col * cellwidth, row * cellheight, (col + 1) * cellwidth, (row + 1) * cellheight,
                                     fill='white')
            can.create_text(((x1+x2)/2,(y1+y2)/2),text='A')

window = Tk()

l1 = Label(window, text="I WANT TO CREATE THIS LABEL")
l1.grid(row=0, column=0)

l2 = Label(window, text="AND THIS TOO", fg='red')
l2.grid(row=1, column=0)

thecanvas = Canvas(window, width=500, height=500)
thecanvas.grid(row=2, column=0)

window.update_idletasks()
checkerboard(thecanvas)
window.mainloop()

您甚至可以使用
pack()
而不是
grid()
,得到相同的结果

l1 = Label(window, text="I WANT TO CREATE THIS LABEL")
l1.pack()

l2 = Label(window, text="AND THIS TOO", fg='red')
l2.pack()

thecanvas = Canvas(window, width=500, height=500)
thecanvas.pack()
如果您确实需要混合管理器,那么您还可以将
Frame
放在
row=0
中,将
Canvas
放在
row=1
中,然后您可以在
Frame
中使用
pack()

frame = Frame(window)
frame.grid(row=0, column=0)

l1 = Label(frame, text="I WANT TO CREATE THIS LABEL")
l1.pack()

l2 = Label(frame, text="AND THIS TOO", fg='red')
l2.pack()

thecanvas = Canvas(window, width=500, height=500)
thecanvas.grid(row=1, column=0)

我可能只会删除棋盘的上边框或将其颜色设置为白色(我现在不记得确切的tkinter选项)。有什么原因禁止您将棋盘放入框架中吗?线条必须是画布的一部分吗?您不使用网格管理器创建棋盘,但使用画布-这会有所不同。可以使用“创建文本”将文本添加到画布。或者您可以将标签放在第0行,将画布放在第1行,或者您可以使用pack而不是grid。请修复缩进,或者至少验证上述代码是否正在运行。还有一件事。。。如何将标签向左对齐?就像我之前展示的图片一样,Grid和pack使用不同的参数来对齐-请参见