Python:tkinder - 处理 window 网格的正确方法?

Python: tkinder - right way to handle window grid?

我的目标是一些工具栏在顶部和一些 table 在底部的应用程序。该应用程序应如下所示:

----------------------------------
' l | m1 | m2 | r |              '
'---------------------------------
' alpha      |   =   |   beta    '
'--------------------------------'
' lb1r           |        lb1l   '
'---------------------------------
' lb2r           |        lb2l   '
'--------------------------------- 

标题

----------------------------------
'     '      '      '     '      '
'  l  '  m1  '  m2  '  r  '      '
'     '      '      '     '      '
'---------------------------------

应该用作工具栏。 body 应该以某种 table.

的形式可视化

不幸的是,我无法合并 tkinter 网格中的单元格,我现在拥有的应用程序如下所示:

-----------------------------------
'             '      '      '     '
'  l          '  m1  '  m2  '  r  '
'             '      '      '     '
'----------------------------------
' alpha       '   =  '      ' beta'
'---------------------------------'
' lb1r        '      '      'lb1l '
'----------------------------------
' lb2r        '      '      'lb2l '
'---------------------------------- 

如何解决格式化此应用程序时遇到的问题?

编辑:我试图用 解决这个问题。我现在的问题是,如何调整蓝框的宽度,使网格横跨整个红框。

意思是,我想从这个转换

--------------------------------------------------
' l | m1 | m2 | r |                              '
'-------------------------------------------------
'       ' alpha      |   =   |   beta    '       '
'       '--------------------------------'       '
' red   ' lb1r           |        lb1l   '  red  '
'       '---------------------------------       '
'       ' lb2r           |        lb2l   '       '
--------------------------------------------------

第一个插图没有红色边框和拉伸 table。

我编辑的代码:

from tkinter import *


root = Tk()

frm_root = Frame(root,bg='red',width=600)
frm_root.pack()

frm_toolbar = Frame(frm_root, width=600, height=25,bg='green')
frm_tbl     = Frame(frm_root,  bg='blue')


##display_green
frm_toolbar.grid(column = 0, row = 0)
frm_toolbar.pack_propagate(0) #when using pack inside of the display

bt11 = Button(frm_toolbar, text="L")
bt11.pack(side='left')


bt12 = Button(frm_toolbar, text="M1")
bt12.pack(side='left')

bt13 = Button(frm_toolbar, text="M2")
bt13.pack(side='left')

bt14 = Button(frm_toolbar, text="R")
bt14.pack(side='left')

##display_yellow
frm_tbl.grid(column = 0, row = 1)
frm_tbl.pack_propagate(0) #when using pack inside of the display

bt21= Button(frm_tbl, text="Alpha")
bt21.grid(column=0, row = 1)

lb0= Label(frm_tbl, text="=")
lb0.grid(column=1, row = 1,columnspan=2)


bt22 = Button(frm_tbl, text="Beta")
bt22.grid(column=3, row = 1)


lb11 = Label(frm_tbl, text="sadasdasdadadsad")
lb11.grid(column=0, row=2,columnspan=2)


lb12 = Label(frm_tbl, text="lb1r")
lb12.grid(column=2, row=2 ,columnspan=2)

lb21 = Label(frm_tbl, text="lbl1l")
lb21.grid(column=0, row=3, columnspan=2)


lb22 = Label(frm_tbl, text="lb1rasdasdadasd")
lb22.grid(column=2, row=3,columnspan=2)

frm_tbl.grid_columnconfigure(1, weight=1)

root.mainloop()

为了实现您想要的效果,我已经配置了您的代码。 我已将 columnspan 替换为 sticky 并将列更改为正确对齐。

from tkinter import *


root = Tk()

frm_root = Frame(root,bg='red',width=600)
frm_root.pack()

frm_toolbar = Frame(frm_root, width=600, height=25,bg='green')
frm_tbl     = Frame(frm_root,  bg='blue')


##display_green
frm_toolbar.grid(column = 0, row = 0)
frm_toolbar.pack_propagate(0) #when using pack inside of the display

bt11 = Button(frm_toolbar, text="L")
bt11.pack(side='left')


bt12 = Button(frm_toolbar, text="M1")
bt12.pack(side='left')

bt13 = Button(frm_toolbar, text="M2")
bt13.pack(side='left')

bt14 = Button(frm_toolbar, text="R")
bt14.pack(side='left')

##display_yellow
frm_tbl.grid(column = 0, row = 1,sticky='we')
frm_tbl.pack_propagate(0) #when using pack inside of the display

bt21= Button(frm_tbl, text="Alpha")
bt21.grid(column=0, row = 1)

lb0= Label(frm_tbl, text="=")
lb0.grid(column=1, row = 1,sticky='ew')


bt22 = Button(frm_tbl, text="Beta")
bt22.grid(column=2, row = 1,sticky='ew')


lb11 = Label(frm_tbl, text="sadasdasdadadsad")
lb11.grid(column=1, row=2,sticky='ew')


lb12 = Label(frm_tbl, text="lb1r")
lb12.grid(column=2, row=2,sticky='ew')

lb21 = Label(frm_tbl, text="lbl1l")
lb21.grid(column=0, row=3,sticky='ew')

lb22 = Label(frm_tbl, text="lb1rasdasdadasd")
lb22.grid(column=2, row=3)

frm_tbl.grid_columnconfigure(1, weight=1)

root.mainloop()

重新考虑您的初始代码,您也可以使用 columnspan。此外,如果您按功能块对代码进行排序,它会让事情变得更清楚:

from tkinter import *

root = Tk()
root.title("BasicWindow")

#widget construction
bt11 = Button(root, text="L")
bt12 = Button(root, text="M1")
bt13 = Button(root, text="M2")
bt14 = Button(root, text="R")
bt21= Button(root, text="Alpha")
lb0= Label(root, text="=")
bt22 = Button(root, text="Beta")
lb11 = Label(root, text="lbl1l")
lb12 = Label(root, text="lb1r")
lb21 = Label(root, text="lbl1l")
lb22 = Label(root, text="lb1r")
#widget placement
bt11.grid(column=0, row=0,sticky='ew')
bt12.grid(column=1, row=0)
bt13.grid(column=2, row=0)
bt14.grid(column=3, row=0,sticky='ew')
bt21.grid(column=0, row=1)
lb0.grid(column=1, row=1,columnspan=2)
bt22.grid(column=3, row=1)
lb11.grid(column=0, row=2)
lb12.grid(column=3, row=2)
lb21.grid(column=0, row=3)
lb22.grid(column=3, row=3)


root.mainloop()