Search code examples
pythonuser-interfacetkinterinterface

Align input labels and results using Tkinter (Python)


I want to align these input labels to the left and align the results label to the center of the interface as shown in the image.

I also welcome suggestions on how I can build a better interface for the program in question.

Interface example

import tkinter as tk
import math
from tkinter import *

def peso_proprio(gama_c, bm, H, hb, B, phi, gama_s):
    gpar_k = float(gama_c) * float(bm)
    Gm1_k = float(gpar_k) * float(H)
    Gm2_k = float(gama_c) * float(bm) * float(hb)
    gb_k = float(gama_c) * float(hb)
    Gb_k = float(gama_c) * float(hb) * float(B)
    sigma_vs = float(gama_s) * float(H)
    G_sk = float(sigma_vs) * float(B)
    K = math.tan(math.radians(45 - (float(phi) / 2))) ** 2
    hs1 = float(K) * float(gama_s) * float(H)
    hs2 = float(K) * float(gama_s) * (float(H) + float(hb))
    Hs1_k = (float(hs1) * float(H)) / 2
    Hs2_k = (float(K) * float(gama_s) * float(hb) * (2 * float(H) + float(hb))) / 2
    Hs_k = float(Hs1_k) + float(Hs2_k)
    mi_e = math.tan(math.radians(float(phi) * 2 / 3))
    FS_d = (float(mi_e) * (float(Gm1_k) + float(Gm2_k) + float(Gb_k) + float(G_sk))) / float(Hs_k)
    FS_t = ((float(Gm1_k) * float(Gm2_k)*(float(bm)/2)) + ((float(Gb_k) + float(G_sk))*(float(bm)+(float(B)/2))))/(float(Hs_k)*((float(H)+float(hb))/3))
    fat_k = float(Hs_k) / (float(B) + float(bm))
    Nbase_k = float(Gm1_k) + float(Gm2_k) + float(Gb_k) + float(G_sk)
    Mbase_k = float(Hs_k) * (float(H) + float(hb)) / 3 + (float(Gm1_k) + float(Gm2_k)) * (float(B) / 2) - (float(Gb_k) + float(G_sk)) * (float(hb) / 2)
    A = float(B) + float(bm)
    W = ((float(B) + float(bm)) ** 2) / 6
    e = float(Mbase_k) / float(Nbase_k)
    e_lim = float(A) / 6
    sigma_sk_max = (float(Nbase_k) / float(A)) + (float(Mbase_k) / float(W))
    sigma_sk_min = (float(Nbase_k) / float(A)) - (float(Mbase_k) / float(W))
    return gpar_k, Gm1_k, Gm2_k, gb_k, Gb_k, sigma_vs, G_sk, K, hs1, hs2, Hs1_k, Hs2_k, Hs_k, mi_e, FS_d, FS_t, fat_k, Nbase_k, Mbase_k, A, W, e, e_lim, sigma_sk_max, sigma_sk_min

def calculate():
    gama_c = gama_c_entry.get()
    bm = bm_entry.get()
    H = H_entry.get()
    hb = hb_entry.get()
    B = B_entry.get()
    gama_s = gama_s_entry.get()
    phi = phi_entry.get()
    SPT = SPT_entry.get()
    Qsc_k = Qsc_k_entry.get()

    result_pp = peso_proprio(gama_c, bm, H, hb, B, phi, gama_s)

    result_label.config(text=f'\nPESO PRÓPRIO\n\ngpar k = {result_pp[0]} kN/m, \nGm1 k = {result_pp[1]} kN, \nGm2 k = {result_pp[2]} kN, \ngb k = {result_pp[3]} kN/m,\nGb k = {result_pp[4]} kN, \nσ vs = {result_pp[5]} Pa,\nGsk = {result_pp[6]}, \nK = {result_pp[7]}, \nhs1 = {result_pp[8]}, \nhs2 = {result_pp[9]}, \nHs1 k = {result_pp[10]}, \nHs2 k = {result_pp[11]}, \nHs k = {result_pp[12]}, \nFS DESLIZAMENTO = {result_pp[13]}, \nFS TOMBAMENTO = {result_pp[14]}, \nFat k = {result_pp[15]}, \nN base = {result_pp[16]}, \nM base = {result_pp[17]},\nÁrea da base = {result_pp[18]} m², \nW = {result_pp[19]} m³, \ne = {result_pp[20]} m,\ne limite = {result_pp[21]} m, \nσsk máx. = {result_pp[22]} kN/m², \nσsk míx. = {result_pp[23]} kN/m²')

root = tk.Tk()

title_label = tk.Label(root, text="MURO DE ARRIMO EM L", font=("Microsoft YaHei", 18))
title_label.pack()

variaveis_label = tk.Label(root, text="\nVARIÁVEIS DE ENTRADA")
variaveis_label.pack()

gama_c_label = tk.Label(root, text="\nEntre γc (kN/m³): ")
gama_c_label.pack()
gama_c_entry = tk.Entry(root)
gama_c_entry.pack()

bm_label = tk.Label(root, text="Entre bm (m): ")
bm_label.pack()
bm_entry = tk.Entry(root)
bm_entry.pack()

H_label = tk.Label(root, text="Entre H (m): ")
H_label.pack()
H_entry = tk.Entry(root)
H_entry.pack()

hb_label = tk.Label(root, text="Entre hb (m): ")
hb_label.pack()
hb_entry = tk.Entry(root)
hb_entry.pack()

B_label = tk.Label(root, text="Entre B (m): ")
B_label.pack()
B_entry = tk.Entry(root)
B_entry.pack()

gama_s_label = tk.Label(root, text="Entre γs (kN/m³): ")
gama_s_label.pack()
gama_s_entry = tk.Entry(root)
gama_s_entry.pack()

phi_label = tk.Label(root, text="Entre φ (°): ")
phi_label.pack()
phi_entry = tk.Entry(root)
phi_entry.pack()

SPT_label = tk.Label(root, text="Entre SPT Médio: ")
SPT_label.pack()
SPT_entry = tk.Entry(root)
SPT_entry.pack()

Qsc_k_label = tk.Label(root, text="Entre sobrecarga (kN): ")
Qsc_k_label.pack()
Qsc_k_entry = tk.Entry(root)
Qsc_k_entry.pack()

calculate_button = tk.Button(root, text="CALCULAR", command=calculate)
calculate_button.pack()

result_label = tk.Label(root, text="")
result_label.pack()

#criar um objeto PhotoImage
image = PhotoImage(file="C:/Users/Usuário/Desktop/Muro_Arrimo.png")

#criar label para mostrar a imagem
image_label = tk.Label(root, image=image)
image_label = tk.Label(root, image=image)
image_label.place(relx=1, x=-10, y=10, anchor="ne")


root.mainloop()

I already tried using the grid method but I think I didn't apply it correctly because all the labels are misaligned like the example below:

root = tk.Tk()

title_label = tk.Label(root, text="MURO DE ARRIMO EM L", font=("Microsoft YaHei", 18))
title_label.grid(row=0, column=0, columnspan=2, pady=5)

variaveis_label = tk.Label(root, text="VARIÁVEIS DE ENTRADA")
variaveis_label.grid(row=1, column=0, columnspan=2, pady=5)

gama_c_label = tk.Label(root, text="Entre γc (kN/m³): ")
gama_c_label.grid(row=2, column=0, pady=5)
gama_c_entry = tk.Entry(root)
gama_c_entry.grid(row=2, column=1, pady=5)

Solution

  • Using tk.Frame makes placement easier. Sorry my english is not good so it's hard to explain.

    import tkinter as tk
    import math
    from tkinter import *
    
    def peso_proprio(gama_c, bm, H, hb, B, phi, gama_s):
        gpar_k = float(gama_c) * float(bm)
        Gm1_k = float(gpar_k) * float(H)
        Gm2_k = float(gama_c) * float(bm) * float(hb)
        gb_k = float(gama_c) * float(hb)
        Gb_k = float(gama_c) * float(hb) * float(B)
        sigma_vs = float(gama_s) * float(H)
        G_sk = float(sigma_vs) * float(B)
        K = math.tan(math.radians(45 - (float(phi) / 2))) ** 2
        hs1 = float(K) * float(gama_s) * float(H)
        hs2 = float(K) * float(gama_s) * (float(H) + float(hb))
        Hs1_k = (float(hs1) * float(H)) / 2
        Hs2_k = (float(K) * float(gama_s) * float(hb) * (2 * float(H) + float(hb))) / 2
        Hs_k = float(Hs1_k) + float(Hs2_k)
        mi_e = math.tan(math.radians(float(phi) * 2 / 3))
        FS_d = (float(mi_e) * (float(Gm1_k) + float(Gm2_k) + float(Gb_k) + float(G_sk))) / float(Hs_k)
        FS_t = ((float(Gm1_k) * float(Gm2_k)*(float(bm)/2)) + ((float(Gb_k) + float(G_sk))*(float(bm)+(float(B)/2))))/(float(Hs_k)*((float(H)+float(hb))/3))
        fat_k = float(Hs_k) / (float(B) + float(bm))
        Nbase_k = float(Gm1_k) + float(Gm2_k) + float(Gb_k) + float(G_sk)
        Mbase_k = float(Hs_k) * (float(H) + float(hb)) / 3 + (float(Gm1_k) + float(Gm2_k)) * (float(B) / 2) - (float(Gb_k) + float(G_sk)) * (float(hb) / 2)
        A = float(B) + float(bm)
        W = ((float(B) + float(bm)) ** 2) / 6
        e = float(Mbase_k) / float(Nbase_k)
        e_lim = float(A) / 6
        sigma_sk_max = (float(Nbase_k) / float(A)) + (float(Mbase_k) / float(W))
        sigma_sk_min = (float(Nbase_k) / float(A)) - (float(Mbase_k) / float(W))
        return gpar_k, Gm1_k, Gm2_k, gb_k, Gb_k, sigma_vs, G_sk, K, hs1, hs2, Hs1_k, Hs2_k, Hs_k, mi_e, FS_d, FS_t, fat_k, Nbase_k, Mbase_k, A, W, e, e_lim, sigma_sk_max, sigma_sk_min
    
    def calculate():
        gama_c = gama_c_entry.get()
        bm = bm_entry.get()
        H = H_entry.get()
        hb = hb_entry.get()
        B = B_entry.get()
        gama_s = gama_s_entry.get()
        phi = phi_entry.get()
        SPT = SPT_entry.get()
        Qsc_k = Qsc_k_entry.get()
    
        result_pp = peso_proprio(gama_c, bm, H, hb, B, phi, gama_s)
    
        result_label.config(text=f'\nPESO PRÓPRIO\n\ngpar k = {result_pp[0]} kN/m, \nGm1 k = {result_pp[1]} kN, \nGm2 k = {result_pp[2]} kN, \ngb k = {result_pp[3]} kN/m,\nGb k = {result_pp[4]} kN, \nσ vs = {result_pp[5]} Pa,\nGsk = {result_pp[6]}, \nK = {result_pp[7]}, \nhs1 = {result_pp[8]}, \nhs2 = {result_pp[9]}, \nHs1 k = {result_pp[10]}, \nHs2 k = {result_pp[11]}, \nHs k = {result_pp[12]}, \nFS DESLIZAMENTO = {result_pp[13]}, \nFS TOMBAMENTO = {result_pp[14]}, \nFat k = {result_pp[15]}, \nN base = {result_pp[16]}, \nM base = {result_pp[17]},\nÁrea da base = {result_pp[18]} m², \nW = {result_pp[19]} m³, \ne = {result_pp[20]} m,\ne limite = {result_pp[21]} m, \nσsk máx. = {result_pp[22]} kN/m², \nσsk míx. = {result_pp[23]} kN/m²')
    
    root = tk.Tk()
    
    input_frame=tk.Frame(root)
    input_frame.pack(side="left", expand=1, fill="both")
    output_frame=tk.Frame(root)
    output_frame.pack(side="left", expand=1, fill="both")
    pic_frame=tk.Frame(root)
    pic_frame.pack(side="left", expand=1, fill="both")
    
    title_label = tk.Label(input_frame, text="MURO DE ARRIMO EM L", font=("Microsoft YaHei", 18))
    title_label.pack()
    
    variaveis_label = tk.Label(input_frame, text="\nVARIÁVEIS DE ENTRADA")
    variaveis_label.pack()
    
    gama_c_label = tk.Label(input_frame, text="\nEntre γc (kN/m³): ")
    gama_c_label.pack()
    gama_c_entry = tk.Entry(input_frame)
    gama_c_entry.pack()
    
    bm_label = tk.Label(input_frame, text="Entre bm (m): ")
    bm_label.pack()
    bm_entry = tk.Entry(input_frame)
    bm_entry.pack()
    
    H_label = tk.Label(input_frame, text="Entre H (m): ")
    H_label.pack()
    H_entry = tk.Entry(input_frame)
    H_entry.pack()
    
    hb_label = tk.Label(input_frame, text="Entre hb (m): ")
    hb_label.pack()
    hb_entry = tk.Entry(input_frame)
    hb_entry.pack()
    
    B_label = tk.Label(input_frame, text="Entre B (m): ")
    B_label.pack()
    B_entry = tk.Entry(input_frame)
    B_entry.pack()
    
    gama_s_label = tk.Label(input_frame, text="Entre γs (kN/m³): ")
    gama_s_label.pack()
    gama_s_entry = tk.Entry(input_frame)
    gama_s_entry.pack()
    
    phi_label = tk.Label(input_frame, text="Entre φ (°): ")
    phi_label.pack()
    phi_entry = tk.Entry(input_frame)
    phi_entry.pack()
    
    SPT_label = tk.Label(input_frame, text="Entre SPT Médio: ")
    SPT_label.pack()
    SPT_entry = tk.Entry(input_frame)
    SPT_entry.pack()
    
    Qsc_k_label = tk.Label(input_frame, text="Entre sobrecarga (kN): ")
    Qsc_k_label.pack()
    Qsc_k_entry = tk.Entry(input_frame)
    Qsc_k_entry.pack()
    
    calculate_button = tk.Button(input_frame, text="CALCULAR", command=calculate)
    calculate_button.pack()
    
    result_label = tk.Label(output_frame, text="")
    result_label.pack()
    
    #criar um objeto PhotoImage
    image = PhotoImage(file="C:/Users/Usuário/Desktop/Muro_Arrimo.png")
    
    
    #criar label para mostrar a imagem
    image_label = tk.Label(pic_frame, image=image)
    image_label.pack()
    
    
    root.mainloop()