Интегрируйте диаграмму в KivyPython

Программы на Python
Ответить
Anonymous
 Интегрируйте диаграмму в Kivy

Сообщение Anonymous »

Я хотел бы добавить диаграмму Kivy. Частично это уже сделано, но хотелось бы знать, как это реализовать. Я использую .py для логики и язык Kivy для дизайна. У меня есть основной файл, содержащий логику, но вкладка, над которой я работаю, называется «Резюме». Она предназначена для отслеживания личного портфеля акций и покупок на фондовом рынке.
from kivy.uix.screenmanager import Screen
from app.components.CardMetrica import CardMetrica
from app.components.BotonNavegacion import BotonNavegacion
from kivy.properties import StringProperty
from kivy.clock import Clock
import sqlite3
import os
from kivy.lang import Builder
from data.database import (
obtener_total_inversion_usd,
obtener_acciones_portafolio,
)

kv_path = os.path.join(os.path.dirname(__file__), '..', '..', 'kv','screens','Resumen.kv')
Builder.load_file(kv_path)

class Resumen(Screen):
total_investment = StringProperty("$ 0.00")

def __init__(self, **kwargs):
super().__init__(**kwargs)
self.datos_cargados = False

def on_enter(self):
"""SE LLAMA CADA VEZ QUE ENTRAS A LA PANTALLA"""
self.cargar_datos()

def cargar_datos(self,dt=None):
"""Carga datos desde database.py"""
try:
# Total inversión
total = obtener_total_inversion_usd()
self.total_investment = f"$ {total:,.2f}"

# Lista de acciones
datos = obtener_acciones_portafolio()

except Exception as e:
print(f"Error cargando portafolio: {e}")

И у меня есть код для графика:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Line
from kivy.uix.label import Label
from kivy.utils import get_color_from_hex
import math

# Paleta de colores
COLOR_PALETTE = ["#FF5733", "#33FF57", "#3357FF", "#F3FF33", "#FF33F3", "#33FFF3"]

class PrecisionDonut(Widget):
def __init__(self, data, **kwargs):
super().__init__(**kwargs)
self.data = data
self.angle_map = []
self.chart_line_width = 50 # Un poco más grueso para facilitar el toque

# Label central
self.center_label = Label(
text="Toca",
halign="center",
font_size='20sp',
bold=True,
color=(1,1,1,1)
)
self.add_widget(self.center_label)

# Listeners
self.bind(pos=self.update_chart, size=self.update_chart)

def update_chart(self, *args):
self.canvas.before.clear()
self.angle_map = []

# Actualizar posición del texto
self.center_label.center = self.center

total = sum([x['value'] for x in self.data])
if total == 0: return

cx, cy = self.center_x, self.center_y
self.radius = min(self.width, self.height) * 0.35

# IMPORTANTE: En Kivy, 0 grados es las 12 en punto (Norte).
current_angle = 0

with self.canvas.before:
for i, item in enumerate(self.data):
value = item['value']
# Calculamos cuánto ocupa esta rebanada
angle_slice = (value / total) * 360

angle_start = current_angle
angle_end = current_angle + angle_slice

hex_color = COLOR_PALETTE[i % len(COLOR_PALETTE)]

# Guardamos datos precisos para la detección
self.angle_map.append({
'start': angle_start,
'end': angle_end,
'data': item,
'color': hex_color
})

# Dibujamos
Color(*get_color_from_hex(hex_color))
# cap='none' mejora la precisión visual en los bordes (quita puntas redondas)
Line(circle=(cx, cy, self.radius, angle_start, angle_end),
width=self.chart_line_width, cap='none')

current_angle += angle_slice

def on_touch_down(self, touch):
# 1. Si el toque no es en este widget, ignorar
if not self.collide_point(*touch.pos):
return super().on_touch_down(touch)

# 2. Calcular vector desde el centro
tx, ty = touch.pos
dx = tx - self.center_x
dy = ty - self.center_y

# 3. Distancia (Pitágoras) para ver si estamos sobre el anillo
touch_radius = math.sqrt(dx**2 + dy**2)

half_width = self.chart_line_width / 2
# Margen de error de 2 píxeles para que se sienta más sensible
if not (self.radius - half_width - 2

Подробнее здесь: https://stackoverflow.com/questions/798 ... -into-kivy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»