我正在使用 tkinter 编写纸牌游戏,但我在网格布局管理器“粘性”配置方面遇到了问题。我希望帮助修复我的代码以使框架显示在所需的位置。在我的代码和下面的插图中,有一个框架 (b2),其中包含另外两个框架(一个绿色,b2a;一个红色;b2b)框架。我想在父框架(框架 b)的底部显示框架 b2。对于帧 b2 以及子帧 b2a 和 b2b,我尝试了 N+S+E+W 的各种组合作为“粘性”的参数。但是,我无法使框架 b2(更重要的是 b2a 和 b2b)出现在所需的位置(下面的底部图像具有正确的位置是在 Illustrator 中制作的)。
特别是,第 27、36 和 37 行中的粘性参数似乎对帧 b2、b2a 和 b2b 在帧 b 内的放置没有影响。
from tkinter import *
from PIL import Image, ImageTk
def main(root):
cons = Frame(root)
cons.grid()
frameDict = setup_frames(cons)
populate_frames(frameDict)
def setup_frames(cons):
frame = {}
# Parental Frames
frame['a'] = Frame(cons, borderwidth=2, relief='groove')
frame['b'] = Frame(cons, borderwidth=2, relief='groove')
frame['c'] = Frame(cons, borderwidth=2, relief='groove')
frame['a'].grid(row=0, column=0, sticky=N+S+E+W)
frame['b'].grid(row=0, column=1, sticky=N+S+E+W)
frame['c'].grid(row=1, column=0, columnspan=2)
# Progeny 0 Frames:
frame['b1'] = Frame(frame['b'], borderwidth=2, relief='groove')
frame['b2'] = Frame(frame['b'], borderwidth=2, relief='groove')
frame['b1'].grid(row=0, column=0, sticky=N+S+E+W)
frame['b2'].grid(row=1, column=0, sticky=N+S+E+W)
# Progeny 1 Frames:
frame['b2a'] = Frame(frame['b2'], borderwidth=2, relief='groove',
background='green')
frame['b2b'] = Frame(frame['b2'], borderwidth=2, relief='groove',
background='red')
frame['b2a'].grid(row=0, column=0, sticky=S)
frame['b2b'].grid(row=0, column=1, sticky=SW)
return frame
def populate_frames(fr):
# Populating 'a' frame
aLab = Label(fr['a'], image=img[0])
aLab.grid()
# Populating b2a & b2b frames
bLab = Label(fr['b2a'], image=img[1])
bLab.grid(row=0, column=0)
bLab = Label(fr['b2b'], image=img[2])
bLab.grid(row=0, column=1)
# Populating c1 frame
cLab = Label(fr['c'], image=img[3])
cLab.grid()
if __name__ == '__main__':
root = Tk()
img = []
w = [40, 160, 80, 480]
h = [180, 60, 60, 60]
for i in range(4):
a = Image.new('RGBA', (w[i], h[i]))
b = ImageTk.PhotoImage(a)
img.append(b)
main(root)
下图说明了违规帧(绿色和红色)的显示位置(顶部)以及我希望它们显示的位置(底部)。
有人可以帮我在正确的位置显示帧 b2 (以及最终的 b2a 和 b2b)吗(编辑:在帧 b 的底部,并从帧 a 的右侧跨越到帧 c 的右侧)?
更新:
正如 Bryan 所建议的,我已经使用网格权重解决了这两个问题(框架 b2 的垂直放置和水平对齐)。垂直放置问题的解决方案很简单,但我不会预测水平对齐问题的解决方案。
我通过给帧 b 中的第 0 行赋予权重 = 1 来解决垂直放置问题(导致下图的上面板)。
我通过将权重 = 1 分配给帧 b 中的第 0 列解决了水平对齐问题(其中帧 b1 和 b2 没有拉伸以填充帧 b)。下图中的帧轮廓显示,b 帧已经从 a 帧的右侧拉伸到 c 帧的右侧。对我来说很奇怪的是,需要对框架中唯一的列赋予权重才能允许子框架水平填充。无论如何,我已经在下面粘贴了我的工作代码。第 40 行和第 41 行解决了我遇到的问题。
from tkinter import *
from PIL import Image, ImageTk
def main(root):
cons = Frame(root)
cons.grid()
frameDict = setup_frames(cons)
populate_frames(frameDict)
def setup_frames(cons):
frame = {}
# Parental Frames
frame['a'] = Frame(cons, borderwidth=2, relief='groove')
frame['b'] = Frame(cons, borderwidth=2, relief='groove')
frame['c'] = Frame(cons, borderwidth=2, relief='groove')
frame['a'].grid(row=0, column=0, sticky=N+S+E+W)
frame['b'].grid(row=0, column=1, sticky=N+S+E+W)
frame['c'].grid(row=1, column=0, columnspan=2)
# Progeny 0 Frames:
frame['b1'] = Frame(frame['b'], borderwidth=2, relief='groove')
frame['b2'] = Frame(frame['b'], borderwidth=2, relief='groove')
frame['b1'].grid(row=0, column=0, sticky=N+S+E+W)
frame['b2'].grid(row=1, column=0, sticky=N+S+E+W)
# Progeny 1 Frames:
frame['b2a'] = Frame(frame['b2'], borderwidth=2, relief='groove',
background='green')
frame['b2b'] = Frame(frame['b2'], borderwidth=2, relief='groove',
background='red')
frame['b2a'].grid(row=0, column=0, sticky=S)
frame['b2b'].grid(row=0, column=1, sticky=SW)
# Weighting
frame['b'].grid_rowconfigure(0, weight=1)
frame['b'].grid_columnconfigure(0, weight=1)
return frame
def populate_frames(fr):
# Populating 'a' frame
aLab = Label(fr['a'], image=img[0])
aLab.grid()
# Populating b2a & b2b frames
bLab = Label(fr['b2a'], image=img[1])
bLab.grid(row=0, column=0)
bLab = Label(fr['b2b'], image=img[2])
bLab.grid(row=0, column=1)
# Populating c1 frame
cLab = Label(fr['c'], image=img[3])
cLab.grid()
if __name__ == '__main__':
root = Tk()
img = []
w = [40, 160, 80, 480]
h = [180, 60, 60, 60]
for i in range(4):
a = Image.new('RGBA', (w[i], h[i]))
b = ImageTk.PhotoImage(a)
img.append(b)
main(root)
与 Bryan 的建议一致,为每个容器中的至少一列和一行分配权重似乎确实是一个很好的经验法则。
这是我修复水平对齐问题之前和之后的结果:
使用Python 3.4,优胜美地