在Python(Tkinter)中在同一窗口中混合两个布局管理器
我对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
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使用不同的参数来对齐-请参见