python - 选项卡式 tkinter GUI 中小部件的均匀水平间距
问题描述
我有一个使用 tkinter 编写的带有 gui 的小程序。gui 有三个不同行数的选项卡,如下图所示。
困扰我的是选项卡底部的空白区域,行数较少。
是否可以将小部件水平均匀分布?
这是使事情到位的代码:
#GUI
root = Tk()
root.title("Mancha de inundação")
root.resizable(False, False)
#tab settings
tabControl = ttk.Notebook(root)
tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl)
tab3 = ttk.Frame(tabControl)
tabControl.add(tab1, text='Passo 1')
tabControl.add(tab2, text='Passo 2', state="disabled")
tabControl.add(tab3, text='Passo 3', state="disabled")
tabControl.pack(expand=1, fill="both")
#Tab1
#lat long
label_y = Label(tab1, text="Latitude:")
label_y.grid(row=1, column=0, sticky='W', padx=10, pady=10)
label_x = Label(tab1, text="Longitude:")
label_x.grid(row=2, column=0, sticky='W', padx=10, pady=10)
entry_y = Entry(tab1, width=8)
entry_y.grid(row=1, column=1, sticky='E', padx=10, pady=10)
entry_x = Entry(tab1, width=8)
entry_x.grid(row=2, column=1, sticky='E', padx=10, pady=10)
#h v
label_h = Label(tab1, text="Altura da barragem (m):")
label_h.grid(row=3, column=0, sticky='W', padx=10, pady=10)
label_v = Label(tab1, text="Volume armazenado (m³):")
label_v.grid(row=4, column=0, sticky='W', padx=10, pady=10)
entry_h = Entry(tab1, width=8)
entry_h.grid(row=3, column=1, sticky='E', padx=10, pady=10)
entry_v = Entry(tab1, width=8)
entry_v.grid(row=4, column=1, sticky='E', padx=10, pady=10)
#calcular
calcular_crio = Button(tab1, text="Calcular", command=calcular_crio)
calcular_crio.grid(row=5, column=1, sticky='E', padx=10, pady=10)
st1 = ScrolledText(tab1, height=10, width=50)
st1.grid(row=6, column=0, columnspan=2, rowspan=10, sticky='nesw')
wl1 = WidgetLogger(st1)
#Tab2
btn_tracado = Button(tab2, text="Carregar traçado do rio", command=carregar_tracado)
btn_tracado.grid(row=0, column=0, sticky='W', padx=10, pady=10)
btn_srtm = Button(tab2, text="Carregar SRTM", command=carregar_srtm)
btn_srtm.grid(row=1, column=0, sticky='W', padx=10, pady=10)
label_suavi = Label(tab2, text="Número de retas para simplificação:")
label_suavi.grid(row=2, column=0, sticky='W', padx=10, pady=10)
entry_suavi = Entry(tab2, width=8)
entry_suavi.insert(0, "8")
entry_suavi.grid(row=2, column=1, sticky='E', padx=10, pady=10)
label_comp = Label(tab2, text="Comprimento das seções (m):")
label_comp.grid(row=3, column=0, sticky='W', padx=10, pady=10)
entry_comp = Entry(tab2, width=8)
entry_comp.insert(0, "4000")
entry_comp.grid(row=3, column=1, sticky='E', padx=10, pady=10)
#intersections
c_intersec_var = IntVar()
c_intersec = Checkbutton(tab2, text='Desinterceptar seções',variable=c_intersec_var, onvalue=1, offvalue=0, command=enable_maxiter)
c_intersec.grid(row=4, column=0, sticky='W', padx=10, pady=10)
label_maxiter = Label(tab2, text="Número máximo de iterações:")
label_maxiter.grid(row=5, column=0, sticky='W', padx=10, pady=10)
entry_maxiter = Entry(tab2, width=8)
entry_maxiter.insert(0, "1000")
entry_maxiter['state'] = 'disabled'
entry_maxiter.grid(row=5, column=1, sticky='E', padx=10, pady=10)
label_maxtime = Label(tab2, text="Tempo máximo (min):")
label_maxtime.grid(row=6, column=0, sticky='W', padx=10, pady=10)
entry_maxtime = Entry(tab2, width=8)
entry_maxtime.insert(0, "5")
entry_maxtime['state'] = 'disabled'
entry_maxtime.grid(row=6, column=1, sticky='E', padx=10, pady=10)
label_intg = Label(tab2, text="Intervalo giro:")
label_intg.grid(row=7, column=0, sticky='W', padx=10, pady=10)
entry_g = Entry(tab2, width=8)
entry_g.insert(0, "-10, 10")
entry_g['state'] = 'disabled'
entry_g.grid(row=7, column=1, sticky='E', padx=10, pady=10)
btn_export = Button(tab2, text="Exportar seções", command=exportar_secoes)
btn_export.grid(row=8, column=0, sticky='W', padx=10, pady=10)
btn_import = Button(tab2, text="Importar seções", command=importar_secoes)
btn_import.grid(row=8, column=1, sticky='E', padx=10, pady=10)
btn_calculartab2 = Button(tab2, text="Calcular", command=calcular_perpendiculares)
btn_calculartab2.grid(row=9, column=1, sticky='E', padx=10, pady=10)
st2 = ScrolledText(tab2, height=10, width=50)
st2.grid(row=10, column=0, columnspan=2, sticky='E')
wl2 = WidgetLogger(st2)
#Tab3
btn_calculartab3 = Button(tab3, text="Calcular", command=calcular)
btn_calculartab3.grid(row=0, column=0, sticky='W', padx=10, pady=10)
btn_salvartab3 = Button(tab3, text="Salvar shape file", command=salvartab3)
btn_salvartab3['state'] = 'disabled'
btn_salvartab3.grid(row=1, column=0, sticky='W', padx=10, pady=10)
btn_salvarrelatab3 = Button(tab3, text="Salvar relatório", command=salvarrelatab3)
btn_salvarrelatab3['state'] = 'disabled'
btn_salvarrelatab3.grid(row=1, column=1, sticky='E', padx=10, pady=10)
st3 = ScrolledText(tab3, height=10, width=50)
st3.grid(row=2, column=0, columnspan=2, sticky='E')
wl3 = WidgetLogger(st3)
解决方案
推荐阅读
- python - 本地 CSS 未在 Flask 模板上加载
- functional-programming - 将一个参数应用于多个函数
- html - 如何在工具栏上将图像和文本一起添加而不会溢出
- loops - print语句执行了多少次?
- postgresql - postgres:不能在名为“文本”的列上使用 to_tsvector
- python - 绘制协方差矩阵的非对角线值
- php - 多个 preg_match - 渲染速度慢,如何更快?
- python - 为 alpha 级别创建自定义图例/指南
- python - 绘制最常见的 20 个词
- java - “内容长度分隔的消息正文过早结束(预期:349;收到:0)”错误