.class { align:center; }
Tkinter

Aplicación de seguimiento de gastos usando Python Tkinter

Recientemente recibimos el requisito de crear una aplicación de escritorio para realizar un seguimiento de los gastos a nivel individual. Así que hemos creado esta aplicación de seguimiento de gastos usando python tkinter con la base de datos sqlite3.

SQLite3 es un software de base de datos gratuito que viene integrado con python. El siguiente comando muestra la importación del módulo SQLite3:

import sqlite3

Aplicación de seguimiento de gastos usando Python

En esta sección, hemos explicado la creación de la Interfaz de la aplicación usando python tkinter. El código completo está dividido en 12 partes y para cada parte, hemos mencionado la descripción en el comentario en negrita.

1. Módulos de importación

El primer paso en la creación de la aplicación es importar los módulos necesarios. Aquí hemos importado todos los módulos disponibles en tkinter

. TTK es el nuevo miembro de la familia tkinter que debe importarse por separado. Al final, hemos importado un módulo de cuadro de mensaje para mostrar el aviso.

2. Crear objeto, título y tamaño de ventana El siguiente paso es crear un objeto para el módulo tkinter. en el código, ws

es el nombre asignado al objeto. Usando este nombre de objeto, hemos asignado un título y un tamaño a la ventana de tkinter de python.

3. Bucle infinito

El bucle principal utilizado en la última línea del código contiene la pantalla para un usuario. El usuario puede ver e interactuar con la ventana gracias al bucle principal. En el backend, aparece una ventana y desaparece inmediatamente en microsegundos. Mainloop repite este proceso de forma ilimitada por lo que aparece una nueva pantalla con los cambios actualizados.

4. Variables globales

amtvar = IntVar()
dopvar = StringVar()

Las hemos llamado variables globales porque usaremos estas variables en diferentes partes del programa. Éramos conscientes de poner la misma fuente para todos los widgets en un programa, por eso el valor con el nombre y el tamaño de la fuente se almacena en una letra simple. Y luego usó esta letra para asignar una fuente a un texto de aplicación.

Estas dos son las variables de texto, una con el tipo de datos entero asignado para almacenar el monto de la compra y la otra es una cadena asignada para registrar la fecha de compra.

5. Widgets de marco

El widget de marco en python tkinter se usa para contener otros widgets en ellos y se vuelve conveniente mover un grupo de widgets simplemente moviendo el widget de contenedor (marco). Se crean dos marcos con los nombres f1 y f2 ambos se posicionan utilizando el administrador de geometría del paquete. los f1 frame contiene todos los widgets excepto el widget Treeview y scrollbar en python tkinter. Estos dos widgets se colocan en el f2

cuadro.

6. Widgets de etiquetas, 7. Widget de entrada, ubicación de cuadrícula de 8 entradas

El widget de etiqueta en python tkinter se usa para mostrar el texto en la ventana de la aplicación. El nombre del artículo, el precio del artículo y la fecha de compra son las etiquetas utilizadas en esta aplicación. El widget de entrada en python tkinter permite al usuario proporcionar su entrada escribiendo en un cuadro rectangular. Hemos utilizado el administrador de geometría de cuadrícula para colocar todos los widgets dentro del f1

widget de marco.

9. Botones de acción, ubicación de cuadrícula de 10 botones

  • Los botones de acción se utilizan en la ventana de la aplicación que realizarán o activarán una función cada vez que se haga clic en ellos en la ventana de la aplicación. Hasta ahora hemos creado 6 tipos de botones en la aplicación.
  • Guardar registro
  • Borrar entrada
  • Salida
  • Balance total
  • Actualizar

Borrar

11. Treeview para ver el registro

Treeview se utiliza para mostrar la salida del registro en un formato tabular organizado. La creación de Treeview tiene tres partes. Primero, hemos creado una vista de árbol y luego le hemos agregado un encabezado o columnas. Después de usar el estilo, hemos mejorado su apariencia.

12. Widget de barra de desplazamiento

#1 import modules
from tkinter import *
from tkinter import ttk
from tkinter import messagebox


#2 create object, title and window size
ws = Tk()
ws.title('Office Expense')
# ws.geometry('600x400')

#4 global variables
f = ('Times new roman', 14)
amtvar = IntVar()
dopvar = StringVar()

#5 frame widgets
f2 = Frame(ws)
f2.pack() 

f1 = Frame(
    ws,
    padx=10,
    pady=10,
)
f1.pack(expand=True, fill=BOTH)


#6 Label Widget
Label(f1, text="ITEM NAME", font=f).grid(row=0, column=0, sticky=W)
Label(f1, text="ITEM PRICE", font=f).grid(row=1, column=0, sticky=W)
Label(f1, text="PURCHASE DATE", font=f).grid(row=2, column=0, sticky=W)

#7 Entry Widgets 
item_name = Entry(f1, font=f)
item_amt = Entry(f1, font=f, textvariable=amtvar)
transaction_date = Entry(f1, font=f, textvariable=dopvar)


#8 Entry grid placement
item_name.grid(row=0, column=1, sticky=EW, padx=(10, 0))
item_amt.grid(row=1, column=1, sticky=EW, padx=(10, 0))
transaction_date.grid(row=2, column=1, sticky=EW, padx=(10, 0))


#9 Action buttons
cur_date = Button(
    f1, 
    text="Current Date", 
    font=f, 
    bg='#04C4D9', 
    command=None,
    width=15
    )

submit_btn = Button(
    f1, 
    text="Save Record", 
    font=f, 
    command=None, 
    bg='#42602D', 
    fg='white'
    )

clr_btn = Button(
    f1, 
    text="Clear Entry", 
    font=f, 
    command=None, 
    bg='#D9B036', 
    fg='white'
    )

quit_btn = Button(
    f1, 
    text="Exit", 
    font=f, 
    command=None, 
    bg='#D33532', 
    fg='white'
    )

total_bal = Button(
    f1,
    text="Total Balance",
    font=f,
    command=None
)

total_bal = Button(
    f1,
    text="Total Balance",
    font=f,
    bg='#486966',
    fg='white',
    command=None
)

total_spent = Button(
    f1,
    text="Total Spent",
    font=f,
    fg='white',
    command=None
)

update_btn = Button(
    f1, 
    text="Update",
    bg='#C2BB00',
    command=None,
    fg='white',
    font=f
)

del_btn = Button(
    f1, 
    text="Delete",
    bg='#BD2A2E',
    fg='white',
    command=None,
    font=f
)

#10 Button grid placement
cur_date.grid(row=3, column=1, sticky=EW, padx=(10, 0))
submit_btn.grid(row=0, column=2, sticky=EW, padx=(10, 0))
clr_btn.grid(row=1, column=2, sticky=EW, padx=(10, 0))
quit_btn.grid(row=2, column=2, sticky=EW, padx=(10, 0))
total_bal.grid(row=0, column=3, sticky=EW, padx=(10, 0))
update_btn.grid(row=1, column=3, sticky=EW, padx=(10, 0))
del_btn.grid(row=2, column=3, sticky=EW, padx=(10, 0))

#11 treeview to view the record
tv = ttk.Treeview(f2, selectmode="browse", columns=(1, 2, 3, 4), show='headings', height=8, )
tv.pack(side="left")

tv.column(1, anchor=CENTER, stretch=NO, width=70)
tv.column(2, anchor=CENTER)
tv.column(3, anchor=CENTER)
tv.column(4, anchor=CENTER)
tv.heading(1, text="Serial no")
tv.heading(2, text="Item Name", )
tv.heading(3, text="Item Price")
tv.heading(4, text="Purchase Date")

style = ttk.Style()
style.theme_use("default")
style.map("Treeview")

#12 scrollbar widget
scrollbar = Scrollbar(f2, orient="vertical")
scrollbar.configure(command=tv.yview)
scrollbar.pack(side="right", fill="y")
tv.config(yscrollcommand=scrollbar.set)


#3 infinite loop
ws.mainloop()

La barra de desplazamiento vertical se agrega al widget Treeview para que, si los datos exceden el tamaño de la pantalla, el usuario aún pueda verlos desplazándose hacia arriba y hacia abajo.

Explicación del backend de la aplicación

Te puede interesar:  Crear documento de Word en Python Tkinter [Complete Source Code + Video]

En esta sección, le explicaremos todo el código fuente relacionado con una base de datos en la aplicación de administración de gastos creada con la base de datos python tkinter y sqlite3.

Hemos creado una clase con los métodos necesarios para realizar operaciones CRUD y luego esta clase se usa como y cuando en el programa para ver, insertar, actualizar y eliminar los datos de la base de datos sqlite3 usando python tkinter.

1 Módulo

Se ha importado el módulo SQLite3 para realizar todas las actividades relacionadas con la base de datos.

2. Clase, constructor y métodos Hemos creado una clase con el nombre Base de datos def __init__(self, db) y esta clase tiene métodos para realizar operaciones CRUD. el codigo despues es un constructor que acepta el nombre de una base de datos como parámetro y también crea una tabla con el nombre registro_de_gastos

  • si no existe ya. los buscarRegistro()
  • El método permite a los usuarios escribir una consulta SQL para obtener la información. los insertarRegistro()
  • El método agrega datos dentro de la base de datos. los eliminarRegistro()
  • El método elimina los datos existentes de la base de datos. los actualizarRegistro()

El método permite actualizar los cambios en la base de datos. Hemos creado esto como un módulo separado con el nombre mydb.py

#1 module
import sqlite3

#2 class, constructor and methods 
class Database:
    def __init__(self, db):
        self.conn = sqlite3.connect(db)
        self.cur = self.conn.cursor()
        self.cur.execute(
            "CREATE TABLE IF NOT EXISTS expense_record (item_name text, item_price float, purchase_date date)")
        self.conn.commit()

    def fetchRecord(self, query):
        self.cur.execute(query)
        rows = self.cur.fetchall()
        return rows

    def insertRecord(self, item_name, item_price, purchase_date):
        self.cur.execute("INSERT INTO expense_record VALUES (?, ?, ?)",
                         (item_name, item_price, purchase_date))
        self.conn.commit()

    def removeRecord(self, rwid):
        self.cur.execute("DELETE FROM expense_record WHERE rowid=?", (rwid,))
        self.conn.commit()

    def updateRecord(self, item_name, item_price, purchase_date, rid):
        self.cur.execute("UPDATE expense_record SET item_name = ?, item_price = ?, purchase_date = ? WHERE rowid = ?",
                         (item_name, item_price, purchase_date, rid))
        self.conn.commit()

    def __del__(self):
        self.conn.close()

por lo que el usuario importará este módulo al programa principal como se muestra en la siguiente sección.

Función y otras operaciones Explicación

En esta sección, discutiremos la parte del código fuente distinta de la GUI y la base de datos. Hablaremos de lo siguiente:

1. Módulo En la sección anterior, hemos creado un módulo con el nombremydb.py

, aquí hemos importado ese módulo y todas sus funciones. Usando los métodos dentro de él, podemos Insertar, Actualizar, Ver y Eliminar los datos de la base de datos en python tkinter.

2. Objeto para base de datos Hemos creado un objeto para la clase Base de datos y le hemos puesto nombredatos . Además, este objeto acepta un parámetro que será el nombre de la base de datos. Hemos proporcionadomisgastos.db pero usted proporciona cualquier nombre con la extensiónbase de datos

.

Tenga en cuenta que carga la base de datos existente proporcionando su nombre en este lugar, pero esa base de datos debe tener las mismas columnas.

3. Variables globales

  • Las variables creadas dentro de una función tienen alcance solo dentro de esa función. Se puede acceder a las variables globales a través del programa y sus valores se ven afectados por los cambios realizados en cualquier momento. los cuenta=0
  • se utiliza más tarde en el programa al insertar datos en la vista de árbol. Allí hemos incrementado el valor de la cuenta para que iid pueda tener un valor único cada vez.
select rowid, * from expense_record;

El SQLite3 tiene una característica de mantener automáticamente la identificación de fila única con el nombre de ID de fila que debe mencionarse al obtener los datos de la base de datos. Este ID de fila es el que se muestra como un número de serie en la interfaz GUI de la aplicación. Hemos almacenado el número de serie de la fila seleccionada por el usuario en la interfaz en la variable globalid_fila_seleccionado

. Ahora, ya que tenemos un ID de fila

de la fila que es seleccionada por el usuario ahora hemos puesto esto en una cláusula where de las funciones Actualizar y Eliminar.

4. Funciones

Analicemos las funciones utilizadas en esta aplicación. Tenga en cuenta que estas funciones son distintas de las funciones de clase de base de datos. Estos se centran principalmente en el uso de esos métodos. los guardarRegistro() esta usando insertarRegistro() método de la clase Database para almacenar los datos en la base de datos. Hemos pasado el parámetro requerido que se obtiene del widget de entrada. Esta función es activada por el enviar_btn

  • Botón en python tkinter. los define la fecha()
  • La función usa la fecha del sistema y la establece en el widget de entrada en un formato de día, mes y año. La función clearEntries() borra todo el widget de entrada. Utiliza el método de eliminación y proporciona valores de inicio y fin para eliminarlo. Esta función es activada por un clr_btn
  • botón. los buscar_registros() La función recupera el ID de fila y otra información de la base de datos utilizando el buscarRegistro()
  • método de la clase de base de datos. Después de obtener los datos, los publica en el widget Treeview en un formato tabular. los seleccionar_registro()
    La función está relacionada con la selección de filas en la vista de árbol. Cada vez que un usuario hace clic en cualquiera de las filas, esta función se activa ya que está vinculada con el clic del mouse. Esta función se encarga de almacenar el ID de fila en la variable global.
  • Este método imprime la fila seleccionada en los widgets de entrada que se pueden actualizar aún más. los actualizar_registro()
  • La función actualiza la información existente en la base de datos. Utiliza el método updaRecord() de la clase de base de datos. los balance total()
  • La función muestra el mensaje emergente con el monto total gastado y el monto restante. De forma predeterminada, ha proporcionado 5000 como cantidad base, lo cambia según su presupuesto. los actualizar datos ()
    es otro método importante ya que permite a los usuarios ver la actualización en tiempo real. Al insertar, actualizar y eliminar datos, debemos realizar esta operación de actualización al final para que los cambios puedan aparecer en tiempo real.
  • Si no vamos a usar esta función, tenemos que reiniciar la aplicación cada vez para ver los cambios. los borrar fila()
    La función elimina la fila seleccionada de la base de datos y la función de actualización muestra inmediatamente los cambios. Entonces, de esta manera, suponga que el usuario seleccionó una fila y luego hizo clic en el botón Eliminar.
#1. module
from mydb import *

#2. object for database
data = Database(db='myexpense.db')

#3. global variables
count = 0
selected_rowid = 0

#4. functions
def saveRecord():
    global data
    data.insertRecord(item_name=item_name.get(), item_price=item_amt.get(), purchase_date=transaction_date.get())
       
def setDate():
    date = dt.datetime.now()
    dopvar.set(f'{date:%d %B %Y}')

def clearEntries():
    item_name.delete(0, 'end')
    item_amt.delete(0, 'end')
    transaction_date.delete(0, 'end')

def fetch_records():
    f = data.fetchRecord('select rowid, * from expense_record')
    global count
    for rec in f:
        tv.insert(parent="", index='0', iid=count, values=(rec[0], rec[1], rec[2], rec[3]))
        count += 1
    tv.after(400, refreshData)

def select_record(event):
    global selected_rowid
    selected = tv.focus()    
    val = tv.item(selected, 'values')
  
    try:
        selected_rowid = val[0]
        d = val[3]
        namevar.set(val[1])
        amtvar.set(val[2])
        dopvar.set(str(d))
    except Exception as ep:
        pass


def update_record():
    global selected_rowid

    selected = tv.focus()
	# Update record
    try:
        data.updateRecord(namevar.get(), amtvar.get(), dopvar.get(), selected_rowid)
        tv.item(selected, text="", values=(namevar.get(), amtvar.get(), dopvar.get()))
    except Exception as ep:
        messagebox.showerror('Error',  ep)

	# Clear entry boxes
    item_name.delete(0, END)
    item_amt.delete(0, END)
    transaction_date.delete(0, END)
    tv.after(400, refreshData)
    

def totalBalance():
    f = data.fetchRecord(query="Select sum(item_price) from expense_record")
    for i in f:
        for j in i:
            messagebox.showinfo('Current Balance: ', f"Total Expense: ' {j} \nBalance Remaining: {5000 - j}")

def refreshData():
    for item in tv.get_children():
      tv.delete(item)
    fetch_records()
    
def deleteRow():
    global selected_rowid
    data.removeRecord(selected_rowid)
    refreshData()

Esta función eliminará la entrada de la base de datos y dado que la entrada se elimina de la base de datos, la fila desaparecerá después de una actualización automática.

Código fuente completo para main.py

# import modules 
from tkinter import *
from tkinter import ttk
import datetime as dt
from mydb import *
from tkinter import messagebox

# object for database
data = Database(db='test.db')

# global variables
count = 0
selected_rowid = 0

# functions
def saveRecord():
    global data
    data.insertRecord(item_name=item_name.get(), item_price=item_amt.get(), purchase_date=transaction_date.get())
       
def setDate():
    date = dt.datetime.now()
    dopvar.set(f'{date:%d %B %Y}')

def clearEntries():
    item_name.delete(0, 'end')
    item_amt.delete(0, 'end')
    transaction_date.delete(0, 'end')

def fetch_records():
    f = data.fetchRecord('select rowid, * from expense_record')
    global count
    for rec in f:
        tv.insert(parent="", index='0', iid=count, values=(rec[0], rec[1], rec[2], rec[3]))
        count += 1
    tv.after(400, refreshData)

def select_record(event):
    global selected_rowid
    selected = tv.focus()    
    val = tv.item(selected, 'values')
  
    try:
        selected_rowid = val[0]
        d = val[3]
        namevar.set(val[1])
        amtvar.set(val[2])
        dopvar.set(str(d))
    except Exception as ep:
        pass


def update_record():
    global selected_rowid

    selected = tv.focus()
	# Update record
    try:
        data.updateRecord(namevar.get(), amtvar.get(), dopvar.get(), selected_rowid)
        tv.item(selected, text="", values=(namevar.get(), amtvar.get(), dopvar.get()))
    except Exception as ep:
        messagebox.showerror('Error',  ep)

	# Clear entry boxes
    item_name.delete(0, END)
    item_amt.delete(0, END)
    transaction_date.delete(0, END)
    tv.after(400, refreshData)
    

def totalBalance():
    f = data.fetchRecord(query="Select sum(item_price) from expense_record")
    for i in f:
        for j in i:
            messagebox.showinfo('Current Balance: ', f"Total Expense: ' {j} \nBalance Remaining: {5000 - j}")

def refreshData():
    for item in tv.get_children():
      tv.delete(item)
    fetch_records()
    
def deleteRow():
    global selected_rowid
    data.removeRecord(selected_rowid)
    refreshData()

# create tkinter object
ws = Tk()
ws.title('Daily Expenses')

# variables
f = ('Times new roman', 14)
namevar = StringVar()
amtvar = IntVar()
dopvar = StringVar()

# Frame widget
f2 = Frame(ws)
f2.pack() 

f1 = Frame(
    ws,
    padx=10,
    pady=10,
)
f1.pack(expand=True, fill=BOTH)


# Label widget
Label(f1, text="ITEM NAME", font=f).grid(row=0, column=0, sticky=W)
Label(f1, text="ITEM PRICE", font=f).grid(row=1, column=0, sticky=W)
Label(f1, text="PURCHASE DATE", font=f).grid(row=2, column=0, sticky=W)

# Entry widgets 
item_name = Entry(f1, font=f, textvariable=namevar)
item_amt = Entry(f1, font=f, textvariable=amtvar)
transaction_date = Entry(f1, font=f, textvariable=dopvar)

# Entry grid placement
item_name.grid(row=0, column=1, sticky=EW, padx=(10, 0))
item_amt.grid(row=1, column=1, sticky=EW, padx=(10, 0))
transaction_date.grid(row=2, column=1, sticky=EW, padx=(10, 0))


# Action buttons
cur_date = Button(
    f1, 
    text="Current Date", 
    font=f, 
    bg='#04C4D9', 
    command=setDate,
    width=15
    )

submit_btn = Button(
    f1, 
    text="Save Record", 
    font=f, 
    command=saveRecord, 
    bg='#42602D', 
    fg='white'
    )

clr_btn = Button(
    f1, 
    text="Clear Entry", 
    font=f, 
    command=clearEntries, 
    bg='#D9B036', 
    fg='white'
    )

quit_btn = Button(
    f1, 
    text="Exit", 
    font=f, 
    command=lambda:ws.destroy(), 
    bg='#D33532', 
    fg='white'
    )

total_bal = Button(
    f1,
    text="Total Balance",
    font=f,
    bg='#486966',
    command=totalBalance
)

total_spent = Button(
    f1,
    text="Total Spent",
    font=f,
    command=lambda:data.fetchRecord('select sum(ite)')
)

update_btn = Button(
    f1, 
    text="Update",
    bg='#C2BB00',
    command=update_record,
    font=f
)

del_btn = Button(
    f1, 
    text="Delete",
    bg='#BD2A2E',
    command=deleteRow,
    font=f
)

# grid placement
cur_date.grid(row=3, column=1, sticky=EW, padx=(10, 0))
submit_btn.grid(row=0, column=2, sticky=EW, padx=(10, 0))
clr_btn.grid(row=1, column=2, sticky=EW, padx=(10, 0))
quit_btn.grid(row=2, column=2, sticky=EW, padx=(10, 0))
total_bal.grid(row=0, column=3, sticky=EW, padx=(10, 0))
update_btn.grid(row=1, column=3, sticky=EW, padx=(10, 0))
del_btn.grid(row=2, column=3, sticky=EW, padx=(10, 0))

# Treeview widget
tv = ttk.Treeview(f2, columns=(1, 2, 3, 4), show='headings', height=8)
tv.pack(side="left")

# add heading to treeview
tv.column(1, anchor=CENTER, stretch=NO, width=70)
tv.column(2, anchor=CENTER)
tv.column(3, anchor=CENTER)
tv.column(4, anchor=CENTER)
tv.heading(1, text="Serial no")
tv.heading(2, text="Item Name", )
tv.heading(3, text="Item Price")
tv.heading(4, text="Purchase Date")

# binding treeview
tv.bind("", select_record)

# style for treeview
style = ttk.Style()
style.theme_use("default")
style.map("Treeview")

# Vertical scrollbar
scrollbar = Scrollbar(f2, orient="vertical")
scrollbar.configure(command=tv.yview)
scrollbar.pack(side="right", fill="y")
tv.config(yscrollcommand=scrollbar.set)

# calling function 
fetch_records()

# infinite loop
ws.mainloop()

El siguiente código fuente es para la aplicación creada con python tkinter. Guarde este archivo con el nombre main.py y ejecútelo para ejecutar esta aplicación completa.

El siguiente resultado muestra la interfaz de las aplicaciones de gestión de gastos. Puede proporcionar el nombre del artículo de compra y el precio del artículo y luego hacer clic en el botón de fecha actual para obtener la fecha actual.

La fecha se puede cambiar si es necesario y luego hacer clic en el botón Guardar registro para almacenar los datos en la base de datos y los datos respectivos se mostrarán en el widget Treeview en la pantalla.

El botón borrar limpiará los widgets de entrada y la salida cerrará la aplicación. El botón de saldo total mostrará el monto total gastado y el monto restante que se introduce en el programa.

sistema de gestión de gastos usando python tkinter

Aplicación de seguimiento de gastos con el ejemplo de Python Tkinter

Código fuente completo Base de datos mydb.py

import sqlite3

class Database:
    def __init__(self, db):
        self.conn = sqlite3.connect(db)
        self.cur = self.conn.cursor()
        self.cur.execute(
            "CREATE TABLE IF NOT EXISTS expense_record (item_name text, item_price float, purchase_date date)")
        self.conn.commit()

    def fetchRecord(self, query):
        self.cur.execute(query)
        rows = self.cur.fetchall()
        return rows

    def insertRecord(self, item_name, item_price, purchase_date):
        self.cur.execute("INSERT INTO expense_record VALUES (?, ?, ?)",
                         (item_name, item_price, purchase_date))
        self.conn.commit()

    def removeRecord(self, rwid):
        self.cur.execute("DELETE FROM expense_record WHERE rowid=?", (rwid,))
        self.conn.commit()

    def updateRecord(self, item_name, item_price, purchase_date, rid):
        self.cur.execute("UPDATE expense_record SET item_name = ?, item_price = ?, purchase_date = ? WHERE rowid = ?",
                         (item_name, item_price, purchase_date, rid))
        self.conn.commit()

    def __del__(self):
        self.conn.close()

El siguiente código fuente es para crear una base de datos en sqlite3 usando python tkinter. Guarde el archivo con el nombre mydb.py en el mismo directorio donde se guarda el programa principal.

La siguiente imagen muestra una representación de datos en la base de datos SQLite3.  Estamos viendo estos datos usando el software DB Browser (SQLite).
Base de datos del administrador de gastos de Python Tkinter

Aplicación de seguimiento de gastos usando Python Tkinter

  • En este sitio podrás encontrar también tutoriales de más de Python Tkinter.
  • Botón de opción Python Tkinter
  • Función Python Tkinter Map()
  • Programa de salida de Python Tkinter

Widget de cuadro de texto de Python Tkinter Entonces, en este tutorial de Python, entendimos cómo construir unAplicación de seguimiento de gastos usando Python Tkinter

. Aquí tenemos cada paso con la ayuda de un ejemplo en Python.

Ryley Crooks

En los Estados Unidos, Python es uno de los lenguajes más utilizados. He usado Python durante mucho tiempo y he trabajado con una variedad de bibliotecas, desde Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc. Comparto contigo mi experiencia de trabajo de muchos años en el campo de la IA.

Publicaciones relacionadas

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
Responsable Birdie Bashirian PhD +info...
Finalidad Gestionar y moderar tus comentarios. +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios No se cederán datos a terceros, salvo obligación legal +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.

Botón volver arriba