Я хотел бы добавить диаграмму 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
Интегрируйте диаграмму в Kivy ⇐ Python
Программы на Python
1764780558
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79837134/integrate-a-chart-into-kivy[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия