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()
我的目标是一些工具栏在顶部和一些 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()