我使用的Tkinter写的纸牌游戏,和我在与他网格布局管理器“粘性”配置的麻烦。 我想帮助我的固定代码,使框架在所需位置显示。 在我的代码和以下说明中,有一帧包含两个其它(b2)的(一个绿色,B2A;和一个红色; B2B)帧。 我想在父帧(B)的底部,以显示帧B2。 我已经试过N + S + E + W的各种组合作为“粘性”的参数,为两个帧B2和子帧B2A和B2B。 不过,我一直无法作出帧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的底部,并从框架的右侧跨越到帧c的右侧)?
更新:我已经使用网格的权重解决了这两个问题(垂直放置和帧B2的水平对齐),为布赖恩建议。 在垂直放置问题的解决方法很简单,但我不会预测解决水平对齐问题。
我通过给权重= 1解决了垂直放置问题帧B与行0(导致如下图的上图)。
我解决了水平对齐问题通过在帧B分配权重= 1到第0列(其中的帧B1和B2没有拉伸以填充帧b)中。 所述框架在下面显示图该帧B已经从一帧的右侧延伸到帧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)
与布赖恩的建议相一致,它似乎是一个很好的经验规则来分配权重,以至少一列,并在每个容器一行。
这里是之前和之后我固定的水平对齐问题:
使用Python 3.4,优胜美地