Blog Pages

Virtual Phone Dialer

import tkinter as tk

from tkinter import messagebox

import sqlite3

from datetime import datetime


# ------------------ DATABASE ------------------ #


conn = sqlite3.connect('call_history.db')

cursor = conn.cursor()

cursor.execute('''

    CREATE TABLE IF NOT EXISTS calls (

        id INTEGER PRIMARY KEY AUTOINCREMENT,

        number TEXT NOT NULL,

        timestamp TEXT NOT NULL

    )

''')

conn.commit()



# ------------------ MAIN DIALER APP ------------------ #


class PhoneDialer:

    def __init__(self, root):

        self.root = root

        self.root.title("📱 Virtual Phone Dialer")

        self.number_var = tk.StringVar()


        self.create_widgets()


    def create_widgets(self):

        # Entry to show the number

        self.display = tk.Entry(self.root, textvariable=self.number_var, font=('Helvetica', 20), bd=10, justify='right')

        self.display.grid(row=0, column=0, columnspan=3, pady=10)


        # Keypad buttons

        btn_texts = [

            '1', '2', '3',

            '4', '5', '6',

            '7', '8', '9',

            '*', '0', '#'

        ]


        r = 1

        c = 0

        for text in btn_texts:

            tk.Button(self.root, text=text, font=('Helvetica', 18), width=5, height=2,

                      command=lambda t=text: self.append_number(t)).grid(row=r, column=c, padx=5, pady=5)

            c += 1

            if c > 2:

                c = 0

                r += 1


        # Call button

        tk.Button(self.root, text="📞 Call", bg="green", fg="white", font=('Helvetica', 18),

                  command=self.make_call).grid(row=5, column=0, pady=10, padx=5, sticky='we')


        # Clear button

        tk.Button(self.root, text="❌ Clear", bg="orange", fg="black", font=('Helvetica', 18),

                  command=self.clear).grid(row=5, column=1, pady=10, padx=5, sticky='we')


        # History button

        tk.Button(self.root, text="🕒 History", bg="blue", fg="white", font=('Helvetica', 18),

                  command=self.show_history).grid(row=5, column=2, pady=10, padx=5, sticky='we')


    def append_number(self, val):

        current = self.number_var.get()

        self.number_var.set(current + val)


    def clear(self):

        self.number_var.set("")


    def make_call(self):

        number = self.number_var.get()

        if number:

            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            cursor.execute("INSERT INTO calls (number, timestamp) VALUES (?, ?)", (number, timestamp))

            conn.commit()

            messagebox.showinfo("Calling", f"Calling {number}...\n(Call logged)")

            self.clear()

        else:

            messagebox.showwarning("Empty", "Please enter a number")


    def show_history(self):

        history_win = tk.Toplevel(self.root)

        history_win.title("📜 Call History")


        tk.Label(history_win, text="Number", font=('Helvetica', 14, 'bold')).grid(row=0, column=0, padx=10, pady=5)

        tk.Label(history_win, text="Timestamp", font=('Helvetica', 14, 'bold')).grid(row=0, column=1, padx=10, pady=5)


        cursor.execute("SELECT number, timestamp FROM calls ORDER BY id DESC")

        rows = cursor.fetchall()


        for idx, (number, timestamp) in enumerate(rows):

            tk.Label(history_win, text=number, font=('Helvetica', 12)).grid(row=idx+1, column=0, padx=10, sticky='w')

            tk.Label(history_win, text=timestamp, font=('Helvetica', 12)).grid(row=idx+1, column=1, padx=10, sticky='w')



# ------------------ RUN APP ------------------ #


if __name__ == "__main__":

    root = tk.Tk()

    app = PhoneDialer(root)

    root.mainloop()


No comments:

Post a Comment