কম্পিউটার টিউটোরিয়াল

পাইথনে Tkinter ব্যবহার করে নোটপ্যাড (Notepad) ডেভেলপ করা


Tkinter হলো পাইথনের একটি GUI লাইব্রেরি जिससे আমরা একাধিক GUI অ্যাপ তৈরি করতে পারি। এখানে, Tkinter ব্যবহার করে আমরা একটি নোটপ্যাড-লাইক টেক্সট এডিটর ডেভেলপ করব। এই নোটপ্যাডে মেনু থাকবে যেখানে নতুন ফাইল তৈরি করা, এক্সিস্টিং ফাইল খোলা, ফাইল সেভ করা, এডিটিং, কাট ও পেস্ট - সব ফাংশনালিটি থাকবে।

প্রিকোয়াজিট (Prerequisite):

  • পাইথন ইনস্টলড।
  • Tkinter ইনস্টলড।

নোট: Tkinter পাইথন ৩.x-এর সাথে স্ট্যান্ডার্ড লাইব্রেরি হিসেবে আসে।

মেনু আইটেম যোগ করা

আমাদের নোটপ্যাডে চারটি প্রধান মেনু আইটেম থাকবে: File, Edit, Commands & Help। File মেনু আইটেমে চারটি সাব-আইটেম থাকবে: New, Open, Save & Exit।

পাইথনে Tkinter ব্যবহার করে নোটপ্যাড (Notepad) ডেভেলপ করা

Edit মেনু আইটেমে তিনটি সাব-আইটেম থাকবে: Cut, Copy & Paste。

পাইথনে Tkinter ব্যবহার করে নোটপ্যাড (Notepad) ডেভেলপ করা

Commands মেনু আইটেমে একটি সাব-আইটেম থাকবে – About Commands,

পাইথনে Tkinter ব্যবহার করে নোটপ্যাড (Notepad) ডেভেলপ করা

এবং Help মেনুতে একটি সাব-আইটেম থাকবে: About Notepad।

পাইথনে Tkinter ব্যবহার করে নোটপ্যাড (Notepad) ডেভেলপ করা

নিচের কোড ব্যবহার করে আমরা এই মেনু আইটেম ও সাব-আইটেমগুলো দেব:

# নতুন ফাইল খোলার জন্য
self.__thisFileMenu.add_command(label="New", command=self.__newFile)
# ইতিমধ্যে এক্সিস্টিং ফাইল খোলার জন্য
self.__thisFileMenu.add_command(label="Open", command=self.__openFile)
# বর্তমান ফাইল সেভ করার জন্য
self.__thisFileMenu.add_command(label="Save", command=self.__saveFile)
# ডায়ালগে একটি লাইন তৈরি করার জন্য
self.__thisFileMenu.add_separator()
self.__thisFileMenu.add_command(label="Exit", command=self.__quitApplication)
self.__thisMenuBar.add_cascade(label="File", menu=self.__thisFileMenu)

# কাট ফিচার দিতে
self.__thisEditMenu.add_command(label="Cut", command=self.__cut)
# কপি ফিচার দিতে
self.__thisEditMenu.add_command(label="Copy", command=self.__copy)
# পেস্ট ফিচার দিতে
self.__thisEditMenu.add_command(label="Paste", command=self.__paste)
# এডিটিং ফিচার দিতে
self.__thisMenuBar.add_cascade(label="Edit", menu=self.__thisEditMenu)

# নোটপ্যাডের বর্ণনা ফিচার তৈরি
self.__thisHelpMenu.add_command(label="About Notepad", command=self.__showAbout)
self.__thisCommandMenu.add_command(label="About Commands", command=self.__showCommand)
self.__thisMenuBar.add_cascade(label="Commands", menu=self.__thisCommandMenu)
self.__thisMenuBar.add_cascade(label="Help", menu=self.__thisHelpMenu)

প্রতিটি মেনু আইটেমে ফাংশনালিটি যোগ করা

এখন মেনু আইটেমগুলো রেডি, এখন আমরা প্রতিটি মেনু আইটেমে ফাংশনালিটি যোগ করব। নিচে ফাংশনালিটির তালিকা যা আমরা এই নোটপ্যাডে যোগ করব (অবশ্যই আপনি আরও অনেক কিছু যোগ করতে পারেন)।

  • Open file
  • New file
  • Save file
  • Quit Application
  • Show About
  • Show Commands
  • Cut
  • Copy
  • Paste

উপরোক্ত ফাংশনালিটি বাস্তবায়ন করার কোড:

def __quitApplication(self):
    self.__root.destroy()
    # exit()

def __showAbout(self):
    showinfo("About Notepad", "Simple text editor like notepad using Python")

def __showCommand(self):
    showinfo("Notepad", "Just Another TextPad \n Copyright \n with BSD license you can use it'")

def __openFile(self):
    self.__file = askopenfilename(defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
    if self.__file == "":
        # কোনো ফাইল খোলা নেই
        self.__file = None
    else:
        # ফাইল খোলার চেষ্টা
        # উইন্ডো টাইটেল সেট
        self.__root.title(os.path.basename(self.__file) + " - Notepad")
        self.__thisTextArea.delete(1.0, END)
        file = open(self.__file, "r")
        self.__thisTextArea.insert(1.0, file.read())
        file.close()

def __newFile(self):
    self.__root.title("Untitled Notepad")
    self.__file = None
    self.__thisTextArea.delete(1.0, END)

def __saveFile(self):
    if self.__file == None:
        # নতুন ফাইল হিসেবে সেভ
        self.__file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
    if self.__file == "":
        self.__file = None
    else:
        # ফাইল সেভ করার চেষ্টা
        file = open(self.__file, "w")
        file.write(self.__thisTextArea.get(1.0, END))
        file.close()
        # উইন্ডো টাইটেল চেঞ্জ
        self.__root.title(os.path.basename(self.__file) + " - Notepad")
    else:
        file = open(self.__file, "w")
        file.write(self.__thisTextArea.get(1.0, END))
        file.close()

def __cut(self):
    self.__thisTextArea.event_generate("<>")

def __copy(self):
    self.__thisTextArea.event_generate("<>")

def __paste(self):
    self.__thisTextArea.event_generate("<>")

এখন আমরা প্রয়োজনীয় প্যাকেজ, মেনু আইটেম এবং প্রয়োজনীয় ফাংশনালিটি যোগ করেছি যা এই Tkinter লাইব্রেরি ব্যবহার করে নোটপ্যাড-লাইক টেক্সট এডিটরে দেখতে পাব।

নিচে Tkinter ব্যবহার করে নোটপ্যাড টেক্সট এডিটর তৈরি করার সম্পূর্ণ প্রোগ্রাম দেওয়া হলো:

# os লাইব্রেরি ইম্পোর্ট
import os
# tkinter থেকে সব কিছু ইম্পোর্ট
from tkinter import *
# মেসেজবক্সের জন্য স্পেস পাওয়ার জন্য
from tkinter.messagebox import *
# ফাইল ডায়ালগ বক্স পাওয়ার জন্য
from tkinter.filedialog import *

class Notepad:
    # রুট উইজেট সেটআপ
    __root = Tk()
    __thisWidth = 500
    __thisHeight = 700
    __thisTextArea = Text(__root)
    __thisMenuBar = Menu(__root)
    __thisFileMenu = Menu(__thisMenuBar, tearoff=0)
    __thisEditMenu = Menu(__thisMenuBar, tearoff=0)
    __thisHelpMenu = Menu(__thisMenuBar, tearoff=0)
    __thisCommandMenu = Menu(__thisMenuBar, tearoff=0)
    # স্ক্রোলবার যোগ
    __thisScrollBar = Scrollbar(__thisTextArea)
    __file = None

    def __init__(self, **kwargs):
        # আইকন
        try:
            self.__root.wm_iconbitmap("Notepad.ico")
        except:
            pass
        # উইন্ডো সাইজ সেট (ডিফল্ট 300x300)
        try:
            self.__thisWidth = kwargs['width']
        except KeyError:
            pass
        try:
            self.__thisHeight = kwargs['height']
        except KeyError:
            pass
        # উইন্ডো টেক্সট
        self.__root.title("Untitled-Notepad")
        # উইন্ডো সেন্টার করুন
        screenWidth = self.__root.winfo_screenwidth()
        screenHeight = self.__root.winfo_screenheight()
        # লেফ্ট এলাইনমেন্ট
        left = (screenWidth / 2) - (self.__thisWidth / 2)
        # রাইট এলাইনমেন্ট
        top = (screenHeight / 2) - (self.__thisHeight / 2)
        # টপ এবং বটম
        self.__root.geometry('%dx%d+%d+%d' % (self.__thisWidth, self.__thisHeight, left, top))
        # টেক্সট এরিয়া অটো রিসাইজেবল করতে
        self.__root.grid_rowconfigure(0, weight=1)
        self.__root.grid_columnconfigure(0, weight=1)
        # কন্ট্রোল (উইজেট) যোগ
        self.__thisTextArea.grid(sticky=N + E + S + W)
        # নতুন ফাইল খোলার জন্য
        self.__thisFileMenu.add_command(label="New", command=self.__newFile)
        # ইতিমধ্যে এক্সিস্টিং ফাইল খোলার জন্য
        self.__thisFileMenu.add_command(label="Open", command=self.__openFile)
        # বর্তমান ফাইল সেভ করার জন্য
        self.__thisFileMenu.add_command(label="Save", command=self.__saveFile)
        # ডায়ালগে একটি লাইন তৈরি
        self.__thisFileMenu.add_separator()
        self.__thisFileMenu.add_command(label="Exit", command=self.__quitApplication)
        self.__thisMenuBar.add_cascade(label="File", menu=self.__thisFileMenu)
        # কাট ফিচার
        self.__thisEditMenu.add_command(label="Cut", command=self.__cut)
        # কপি ফিচার
        self.__thisEditMenu.add_command(label="Copy", command=self.__copy)
        # পেস্ট ফিচার
        self.__thisEditMenu.add_command(label="Paste", command=self.__paste)
        # এডিটিং ফিচার
        self.__thisMenuBar.add_cascade(label="Edit", menu=self.__thisEditMenu)
        # নোটপ্যাড বর্ণনা ফিচার
        self.__thisHelpMenu.add_command(label="About Notepad", command=self.__showAbout)
        self.__thisCommandMenu.add_command(label="About Commands", command=self.__showCommand)
        self.__thisMenuBar.add_cascade(label="Commands", menu=self.__thisCommandMenu)
        self.__thisMenuBar.add_cascade(label="Help", menu=self.__thisHelpMenu)
        self.__root.config(menu=self.__thisMenuBar)
        self.__thisScrollBar.pack(side=RIGHT, fill=Y)
        # কন্টেন্ট অনুযায়ী স্ক্রোলবার অটোমেটিক্যালি অ্যাডজাস্ট হবে
        self.__thisScrollBar.config(command=self.__thisTextArea.yview)
        self.__thisTextArea.config(yscrollcommand=self.__thisScrollBar.set)

    def __quitApplication(self):
        self.__root.destroy()
        # exit()

    def __showAbout(self):
        showinfo("About Notepad", "Simple text editor like notepad using Python")

    def __showCommand(self):
        showinfo("Notepad", "Just Another TextPad \n Copyright \n with BSD license you can use it'")

    def __openFile(self):
        self.__file = askopenfilename(defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
        if self.__file == "":
            # কোনো ফাইল খোলা নেই
            self.__file = None
        else:
            # ফাইল খোলার চেষ্টা
            # উইন্ডো টাইটেল সেট
            self.__root.title(os.path.basename(self.__file) + " - Notepad")
            self.__thisTextArea.delete(1.0, END)
            file = open(self.__file, "r")
            self.__thisTextArea.insert(1.0, file.read())
            file.close()

    def __newFile(self):
        self.__root.title("Untitled Notepad")
        self.__file = None
        self.__thisTextArea.delete(1.0, END)

    def __saveFile(self):
        if self.__file == None:
            # নতুন ফাইল হিসেবে সেভ
            self.__file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")])
        if self.__file == "":
            self.__file = None
        else:
            # ফাইল সেভ করার চেষ্টা
            file = open(self.__file, "w")
            file.write(self.__thisTextArea.get(1.0, END))
            file.close()
            # উইন্ডো টাইটেল চেঞ্জ
            self.__root.title(os.path.basename(self.__file) + " - Notepad")
        else:
            file = open(self.__file, "w")
            file.write(self.__thisTextArea.get(1.0, END))
            file.close()

    def __cut(self):
        self.__thisTextArea.event_generate("<>")

    def __copy(self):
        self.__thisTextArea.event_generate("<>")

    def __paste(self):
        self.__thisTextArea.event_generate("<>")

    def run(self):
        # মেইন অ্যাপ্লিকেশন রান
        self.__root.mainloop()

# মেইন অ্যাপ্লিকেশন রান
notepad = Notepad(width=600, height=400)
notepad.run()

উপরের প্রোগ্রাম চালালে, আমরা একটি পপ-আপ নোটপ্যাড টেক্সট এডিটর পাব, কিছু এই রকম:

পাইথনে Tkinter ব্যবহার করে নোটপ্যাড (Notepad) ডেভেলপ করা

এই নোটপ্যাডে আমরা লিখতে পারব, সেভ করতে পারব এবং আমাদের সেভ করা ফাইল (অথবা অন্য কোনো ফাইল) খুলতে পারব। খোলা ফাইলের কন্টেন্ট থেকে কাট, কপি ও পেস্ট করতে পারব। এই নতুন তৈরি নোটপ্যাডের সব মেনু আইটেম ব্যবহার করা যাবে।

  1. পাইথনে ইমেজ-ভিত্তিক Стеগানোগ্রাফি (Steganography)

  2. পাইথনে Base64 ডেটা এনকোডিং (base64 মডিউল)

  3. পাইথন দিয়ে ওয়েবসাইট ব্লকার তৈরি করা

  4. পাইথন Tkinter-এ কালার গেম তৈরি