Custo Total da Acção (usando Tkinter)

from tkinter import *
import requests
from bs4 import BeautifulSoup

class Tooltip:
def __init__(self, widget, text):
self.widget = widget
self.text = text
self.tooltip_window = None
self.widget.bind("<Enter>", self.show_tooltip)
self.widget.bind("<Leave>", self.hide_tooltip)

def show_tooltip(self, event=None):
if self.tooltip_window is not None:
return
x, y, _, _ = self.widget.bbox("insert")
x += self.widget.winfo_rootx() + 25
y += self.widget.winfo_rooty() + 25
self.tooltip_window = Toplevel(self.widget)
self.tooltip_window.wm_overrideredirect(True)
self.tooltip_window.wm_geometry(f"+{x}+{y}")
label = Label(self.tooltip_window, text=self.text, background="lightyellow", borderwidth=1, relief="solid")
label.pack()

def hide_tooltip(self, event=None):
if self.tooltip_window:
self.tooltip_window.destroy()
self.tooltip_window = None

# Configuração da janela principal
root = Tk()
root.geometry("500x500")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Custo Total da Acção")

# Título
titulo = Label(text="Custo Total da Ação",
font=("Arial", "28", "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.13, rely=0.05)

# Rótulo para o símbolo da ação
texto_sub1 = Label(text="Símbolo da ação :",
font=("Arial", "18", "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.05, rely=0.25)

# Rótulo para o número de ações
texto_sub2 = Label(text="Número de ações :",
font=("Arial", "18", "bold"), bg="#103030", fg="#49e3e3")
texto_sub2.place(relx=0.05, rely=0.4)
tooltip = Tooltip(texto_sub1, "Digite o símbolo da ação (ex: AAPL para Apple)")
tooltip2 = Tooltip(texto_sub2, "Digite o número de acções que deseja comprar")
# Entrada para o símbolo da ação
símbolo = StringVar()
símbolo_entrada = Entry(textvariable=símbolo,
font=("Arial", "12", "bold"),
bg="white", fg="blue", justify='center')
símbolo_entrada.place(relx=0.52, rely=0.26, relwidth=0.4)
símbolo_entrada.focus()

# Entrada para o número de ações
número = StringVar()
número_entrada = Entry(textvariable=número,
font=("Arial", "12", "bold"),
bg="white", fg="blue", justify='center')
número_entrada.place(relx=0.52, rely=0.41, relwidth=0.4)

def limpar():
número_entrada.delete(0, END)
símbolo_entrada.delete(0, END)
resultado_texto.config(text="")

def app():
try:
n = int(número.get())
s = símbolo.get().strip().upper() # Pega o símbolo da entrada

if not s: # Verifica se o símbolo da ação não está vazio
resultado_texto.config(text="Por favor, insira um símbolo válido.")
return

url = f"https://finance.yahoo.com/quote/{s}"
resposta = requests.get(url)

if resposta.status_code == 200:
sopa = BeautifulSoup(resposta.text, 'html.parser')
preco = sopa.find('fin-streamer', {'data-field': 'regularMarketPrice'}).text
preco_float = float(preco.replace(',', '')) # Converter o preço para float
total = n * preco_float
resultado_texto.config(text=f"Custo Total: ${total:.2f}")
else:
resultado_texto.config(text="Erro ao acessar o site")

except ValueError:
resultado_texto.config(text="Valor digitado inválido")
except Exception as e:
resultado_texto.config(text=f"Ocorreu um erro: {str(e)}")

# Botões
but1 = Button(text="Calcular", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.65, relwidth=0.25, relheight=0.1)

but_limpar = Button(text="Limpar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=limpar)
but_limpar.place(relx=0.4, rely=0.65, relwidth=0.25, relheight=0.1)

but_sair = Button(text="Sair", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=root.destroy)
but_sair.place(relx=0.7, rely=0.65, relwidth=0.25, relheight=0.1)

resultado_texto = Label(text="",
font=("Arial", 12, "bold"), bg="#cfe2f3")
resultado_texto.place(relx=0.05, rely=0.8, relwidth=0.9, relheight=0.15)

# Executa o loop principal
root.mainloop()

Comentários

Mensagens populares deste blogue

Criar Cartões de Visita

12 signos egípcios

Calcular a percentagem de ocupação