Monday, March 18, 2019

பைத்தான் GUI நிரல்கள் (Tkinter Tutorial)



இந்த கட்டுரையில் பைத்தான் டிகின்டெர்(Tkinter) பேக்கேஜ் பயன்படுத்தி எவ்வாறு கிராபிக்கல் யூசர் இன்டெர் ஃபேஸ் உருவாக்குவது என்பது குறித்து காண்போம்.
Tkinter package ஆனது பைத்தானுடன் சேர்ந்தே வருகின்றது. பைத்தான் இன்ஸ்டால் செய்தால் போதும். தனியாக ஏதும் இன்ஸ்டால் செய்ய தேவையில்லை
இதற்கு நாம்  Python 3.6 பயன்படுத்துவோம். பைத்தான் 2.x பயன்படுத்துவர் என்றால் இதற்கு மாறிக் கொள்ளவும்.
இந்த கட்டுரையில் பட்டனில் ஆரம்பித்து காம்போபாக்ஸ் என சிறிது சிறிதாக காண்போம்.
முதல் GUI இன்டெர்ஃபேஸ்
முதலில் டிகின்டெர் பேக்கேஜை இம்போர்ட் செய்து பிறகு விண்டோ உருவாக்குவோம். பிறகு அதன் டைட்டிலை மதிப்பிருத்துவோம்
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.mainloop()
அவுட் புட்:
.maill loop ஃபங்க்சன் ஆனது முடிவில்லாத லூப்பை ஏற்படுத்தும் எனவே விண்டோ ஆனது மூடப்படாமல் காண்பிக்கப்படும்.
Label Widget
இப்பொழுது ஒரு லேபல் உருவாக்குவதற்கு பின் வரும் நிரல் வரிகளை பயன்படுத்தலாம்
lbl = Label(window, text="Hello")
இப்பொழுது grid ஃபங்க்சன் பயன்படுத்தி அதை லொகேசனைக் குறிப்பிடலாம்.
lbl.grid(column=0, row=0)
சான்று நிரல்
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
window.mainloop()
வெளியீடு:
Grid ஃபங்க்சன் அழைக்கப்படாமல் லேபள் ஆனது காண்பிக்கப்படாது.
Label ஃபாண்ட் சைஸ்
இப்பொழுது லேபிளின் ஃபாண்ட் அளவை எவ்வாறு மாற்றியமைப்பது என்பது குறித்துக் காண்போம்.
lbl = Label(window, text="Hello", font=("Arial Bold", 50))
font  பராமீட்டரை லேபிள் மற்றுமல்லாமல் எல்லா கன்ட்ரோல்களுக்கும் பயன்படுத்தலாம்.
Window Size மதிப்பிருத்துதல்.
விண்டோ அளவை geometry ஃபங்க்சனை பயன்படுத்தி மாற்றியமைக்கலாம்.
window.geometry('350x200')
இந்த கமாண்ட் ஆனது 350 பிக்ஸல் அகலத்திற்கும் 200 பிக்ஸல் உயரத்திற்கும் மாற்றியமைகின்றது.
பட்டன் விட்ஜெட்
லேபள் போலவே பட்டனையும் ஆட் செய்து கொள்ளலாம்.
btn = Button(window, text="Click Me")
btn.grid(column=1, row=0)
சான்று நிரல்.
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
btn = Button(window, text="Click Me")
btn.grid(column=1, row=0)
window.mainloop()
வெளியீடு:
மேலே உள்ள சான்று நிரலில் பட்டனை 1வது காலத்தில் இருத்தியுள்ளோம். நாம் மறந்து 0வது காலத்திலேயே இருத்தினால் லேபள் மறைக்கப் பட்டு அதன் மேல் பட்டன் காண்பிக்கப்படும்.
பட்டனின் ஃபோர் கலர் மற்றும் பேக்ரவுண்ட் கலர் மாற்றுதல்.
ஃபோர் கலரை fg என்ற பிராப்பர்ட்டி உபயோகப்படுத்தி மாற்றலாம். பேக்ரவுண்ட் கலரை bg என்ற பிராப்பர்ட்டியை பயன்படுத்தி மாற்றலாம்.

btn = Button(window, text="Click Me", bg="orange", fg="red")
இப்பொழுது பட்டனை கிளிக் செய்தால் எந்த வித செயற்பாடும் நடக்காது ஏனெனில் அதற்குறிய கோடிங்கை எழுத வில்லை.
பட்டன் கிளிக் ஈவண்ட்
முதலில் clicked என்று ஃபங்க்சனை எழுதுவோம்.
def clicked():
    lbl.configure(text="Button was clicked !!")
இப்பொழுது அந்த ஃபங்க்சனை பட்டன் கிரியேட் வரியில் குறிப்பிவோம்.
 btn = Button(window, text= "Click Me", command=clicked)
சான்று நிரல்:
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
def clicked():
    lbl.configure(text="Button was clicked !!")
btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=1, row=0)
window.mainloop()
வெளியீடு:
Cool!
இன்புட் வாங்கும் கருவி (Tkinter Textbox)
யூசர் இன்புட் வாங்குவதற்கு Entry கிளாஸ் பயன்படுகின்றது.
 இதனை பின் வருமாறு உபயோகிக்கலாம்.
txt = Entry(window,width=10)
சான்று நிரல்:
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
txt = Entry(window,width=10)
txt.grid(column=1, row=0)
def clicked():
    lbl.configure(text="Button was clicked !!")
btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=2, row=0)
window.mainloop()
இப்பொழுது பட்டனை கிளிக் செய்தால் மேலே உள்ளவாறே வெளியீடு வரும்.என்ட்ரியில் நாம் கொடுத்த இன்புட்டை எவ்வாறு பெறுவது? அதை எவ்வாறு வெளியீடு செய்வது? பின் வருமாறு செய்யலாம்.
முதலில் get ஃபங்க்சன் மூலம் அந்த இன்புட்டை பெற வேண்டும். பின் clicked ஃபங்க்சனில் பின் வருமாறு கோடிங்க் எழுதலாம்.
def clicked():
    res = "Welcome to " + txt.get()
    lbl.configure(text= res)
இப்பொழுது பட்டனை கிளிக் செய்தால் அவுட்புட் வரும்.
சான்று நிரல்.
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
lbl = Label(window, text="Hello")
lbl.grid(column=0, row=0)
txt = Entry(window,width=10)
txt.grid(column=1, row=0)
def clicked():
    res = "Welcome to " + txt.get()
    lbl.configure(text= res)
btn = Button(window, text="Click Me", command=clicked)
btn.grid(column=2, row=0)
window.mainloop()
வெளியீடு:

இப்பொழுது  ஒவ்வொரு தடவையும் என்ட்ரி கருவியில் இன்புட் கொடுத்து வெவ்வேறு அவுட்புட்களை பெறலாம்.
என்ட்ரி கருவியில் ஃபோகஸ் செய்தல்.

 இதை மிக எளிதாக focus என்ற ஃபங்க்சனை அழைப்பதன் மூலம் செய்யலாம்.
txt.focus()
இப்பொழுது நிரலை இயக்கினால் என்ட்ரி கருவியில் ஃபோகஸ் இருக்கும்.இப்பொழுது மிக எளிதாக இன்புட் கொடுக்கலாம்
என்ட்ரி கருவியை டிஸ்ஸேபிள் செய்தல்.
State பிராப்பர்ட்டிக்கு disabled என்று மதிப்பிருத்தலின் மூலம் இதை மிக எளிதாக செய்யலாம்.
txt = Entry(window,width=10, state='disabled')
Combobox கருவி
காம்போபாக்ஸ் கருவியை combobox கிளாஸை உபயோகித்தலின் மூலம் நடைமுறைப்படுத்தலாம்.
from tkinter.ttk import *
combo = Combobox(window)
சான்று நிரல்.
from tkinter import *
from tkinter.ttk import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
combo = Combobox(window)
combo['values']= (1, 2, 3, 4, 5, "Text")
combo.current(1) #set the selected item
combo.grid(column=0, row=0)
window.mainloop()
மேலே உள்ள சான்று நிரலில் காம்போ பாக்ஸ் ஐட்டம்களை tuple உபயோகித்து நடைமுறைப் படுத்தலாம்.
செலக்டட் ஐட்டம் செட் செய்வதற்கு current ஃபங்க்சனுக்கு இண்டெக்ஸ் மதிப்பை பாஸ் செய்யலாம்.
செலக்டட் ஐட்டத்தை கெட் செய்வதற்கு பின் வருமாறு get ஃபங்க்சனை  உபயோகிகலாம்.
combo.get()
Checkbutton கருவி (Tkinter Checkbox)
செக் பட்டன் கிரியேட் செய்வதற்கு checkbutton கிளாஸை பின் வருமாறு உபயோக்கிகலாம்.
chk = Checkbutton(window, text='Choose')
செக்குடு ஸ்டேட்டை செட் செய்திட பின் வருமாறு கோடிங்க் எழுதலாம்.
from tkinter import *
from tkinter.ttk import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
chk_state = BooleanVar()
chk_state.set(True) #set check state
chk = Checkbutton(window, text='Choose', var=chk_state)
chk.grid(column=0, row=0)
window.mainloop()
வெளியீடு:
Set the Check State of a Checkbutton
இங்கு  BooleanVar   என்ற டைப்பின் வேரியபிள் பயன்படுத்தியுள்ளோம். இது ஸ்டாண்டர்ட் பைத்தான் வேரியபிள் கிடையாது. இது TKinter வேரியபிள் ஆகும்.
இதை IntVar டைப் வேரியபிளை உபயோகித்தும் 0 அல்லது 1 என்ற மதிப்பை பாஸ் செய்யலாம்.
chk_state = IntVar()
chk_state.set(0) #uncheck
chk_state.set(1) #check
Radio Button கருவி
ரேடியோ பட்டன் உருவாக்குவதற்கு  RadioButton  என்ற் கிளாசை உப்யோகிக்கலாம்.
rad1 = Radiobutton(window,text='First', value=1)
சான்று நிரல்:
from tkinter import *
from tkinter.ttk import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
rad1 = Radiobutton(window,text='First', value=1)
rad2 = Radiobutton(window,text='Second', value=2)
rad3 = Radiobutton(window,text='Third', value=3)
rad1.grid(column=0, row=0)
rad2.grid(column=1, row=0)
rad3.grid(column=2, row=0)
window.mainloop()
வெளியீடு:
மேலும் ரேடியோ பட்டன்களுக்கு commad பிராப்பர்டிக்கு மதிப்பிருத்துவதன் மூலம் அதை கிளிக் செய்யும் பொழுது என்ன செயற்பாடு நடக்க வேண்டுமென்று நிரல் எழுதலாம்.
சான்று:
rad1 = Radiobutton(window,text='First', value=1, command=clicked)
def clicked():
# Do what you need
 Radio Button மதிப்புகளை செட் செய்தல். (Selected Radio Button)
செலக்டட் ரேடியோ பட்டன்களின் மதிப்புகளை பெறுவதற்கு variable பராமீட்டருக்கு மதிப்புகளை பாஸ் செய்து பின்பு கெட் செய்து கொள்ளலாம்.
சான்று நிரல்.
from tkinter import *
from tkinter.ttk import *
window = Tk()
window.title("Welcome to LikeGeeks app")
selected = IntVar()
rad1 = Radiobutton(window,text='First', value=1, variable=selected)
rad2 = Radiobutton(window,text='Second', value=2, variable=selected)
rad3 = Radiobutton(window,text='Third', value=3, variable=selected)
def clicked():
   print(selected.get())
btn = Button(window, text="Click Me", command=clicked)
rad1.grid(column=0, row=0)
rad2.grid(column=1, row=0)
rad3.grid(column=2, row=0)
btn.grid(column=3, row=0)
window.mainloop()

ஒவ்வொரு தடவை ஒரு ரேடியோ பட்டனை கிளிக் செய்யும் பொழுது ஒவ்வொரு மதிப்பும் கிடைக்கும்.
ScrolledText கருவி(Tkinter textarea)
ScrolledText கருவியை உருவாக்குவதற்கு ScrolledTextஎன்ற கிளாஸை பயன்படுத்தலாம்.
from tkinter import scrolledtext
txt = scrolledtext.ScrolledText(window,width=40,height=10)
சான்று நிரல்
from tkinter import *
from tkinter import scrolledtext
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
txt = scrolledtext.ScrolledText(window,width=40,height=10)
txt.grid(column=0,row=0)
window.mainloop()
வெளியீடு
Scrolledtext கண்டெண்ட் செட் செய்தல்.
Insert மெத்தட் பயன்படுத்தி  scrolledtext –ன் மதிப்பிருத்தலாம்.
txt.insert(INSERT,'You text goes here')
Scrolledtext கண்டெண்ட் கிளியர் செய்தல்.
txt.delete(1.0,END)
Message Box உருவாக்குதல்
Messagebox லைப்ரரி பயன்படுத்தி மெஸ்ஸேஜ் பாக்ஸ் உருவாக்கலாம்.
from tkinter import messagebox
messagebox.showinfo('Message title','Message content')
சான்று நிரல்.
from tkinter import *
from tkinter import messagebox
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
def clicked():
    messagebox.showinfo('Message title', 'Message content')
btn = Button(window,text='Click here', command=clicked)
btn.grid(column=0,row=0)
window.mainloop()
பட்டனை கிளிக் செய்யும் பொழுது மெஸ்ஸேஜ் பாக்ஸ் காண்பிக்கபடும்.
Show Warning and Error Messages
மெஸ்ஸேஜ் ஃபங்க்சனை மாற்றியமைத்தலின் மூலம் வார்னிங்க் மற்றும் எர்ரர் மெஸ்ஸேஜ் ஃபங்க்சனை பெறலாம்.
messagebox.showwarning('Message title', 'Message content')  #shows warning message
messagebox.showerror('Message title', 'Message content')    #shows error message
Ask Question Dialogs
yes/no  ஃபங்க்சனுக்குன் பின் வரும் ஏதாவது ஒரு மெஸ்ஸேஜ் ஃபங்க்சனை பயன்படுத்தலாம்.
from tkinter import messagebox
res = messagebox.askquestion('Message title','Message content')
res = messagebox.askyesno('Message title','Message content')
res = messagebox.askyesnocancel('Message title','Message content')
res = messagebox.askokcancel('Message title','Message content')
res = messagebox.askretrycancel('Message title','Message content')
 நீங்கள்  OK அல்லது yes அல்லது retry கிளிக் செய்தால் true என்ற மதிப்பை ரிடர்ன் செய்யும்.நீங்கள் no அல்லது cancelசெலக்ட் செய்தால்  False என்ற மதிப்பை ரிடர்ன் செய்யும்.
மூன்று மதிப்புகளை ரிடர்ன் செய்யும் ஒரே ஒரு ஃபங்க்சன் askyesnocancel ஆகும். இது True அல்லது False அல்லது None மதிப்பை ரிடர்ன் செய்யும்.
SpinBox (Numbers Widget)
இதற்கு Spinbox கிளாஸ் பயன்படுகின்றது
spin = Spinbox(window, from_=0, to=100)
இங்கு spinbox கருவிக்கு from_ என்பதற்கு தொடக்க மதிப்பையும் to என்பதற்கு இறுதி மதிப்பையும் செட் செய்யலாம்.மேலும் width என்ற பிராப்பர்ட்டி அதன் அகலத்தை குறிப்பிட பயன்படுகின்றது.
spin = Spinbox(window, from_=0, to=100, width=5)
சான்று நிரல்
from tkinter import *
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
spin = Spinbox(window, from_=0, to=100, width=5)
spin.grid(column=0,row=0)
window.mainloop()

முழு ரேஞ்சும் குறிப்பிடாமல் குறிப்பிட்ட மதிப்பை மற்றும் கொடுக்கலாம்.
spin = Spinbox(window, values=(3, 8, 11), width=5)
இப்பொழுது  Spinbox கருவி ஆனது  3, 8, மற்றும் 11 ஆகிய மதிப்புகளை மற்றும் கொண்டிருக்கும்.
Spinbox டிஃபால்ட் மதிப்பை செட் செய்தல்.
இதற்கு textvariable என்ற பராமீட்டருக்கு நாம் அனுப்பும் மதிப்பு பயன்படுகின்றது
var =IntVar()
var.set(36)
spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var)
இப்பொழுது நிரலை இயக்கினால் 36 என்ற மதிப்பு செட் செய்யப்பட்டிருக்கும்.
Progressbar கருவி
progress bar உருவாக்குவதற்கு  progressbar கிளாஸ் பயன்படுகின்றது.
from tkinter.ttk import Progressbar
bar = Progressbar(window, length=200)
பிராக்கிரஸ் பார் மதிப்புகளை பின் வருமாறு செட் செய்திடலாம்.
bar['value'] = 70
ஒரு குறிப்பிட்ட செயற்பாடு எந்த நிலையில் உள்ளது என்பதை குறிப்பிட பிராக்கிரஸ் பார் பயன்படுகின்றது. உதாரணத்திற்கு ஒரு ஃபைல் டவுன் லோட் ஆகும் செயற்பாடு எந்த நிலையில் உள்ளது என்பதைக் காண்பிப்பதற்கு இந்தக் கருவியை பயன்படுத்தலாம்.
Progressbar நிறம் மாற்றுதல்.
முதலில் ஒரு குறிப்பிட்ட பேக்ரவுண்ட் நிறம் குறிப்பிட்டு ஒரு ஸ்டைல் உருவாக்கி பிறகு அதை பிராக்கிரஸ் பார் ஸ்டைலாக குறிப்பிடலாம்.
சான்று நிரல்
from tkinter import *
from tkinter.ttk import Progressbar
from tkinter import ttk
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
style = ttk.Style()
style.theme_use('default')
style.configure("black.Horizontal.TProgressbar", background='black')
bar = Progressbar(window, length=200, style='black.Horizontal.TProgressbar')
bar['value'] = 70
bar.grid(column=0, row=0)
window.mainloop()
வெளியீடு:
File Dialog (File and Directory Chooser) உருவாக்குதல்.
இதற்கு filedialog கிளாஸ் பயன்படுகின்றது.
from tkinter import filedialog
file = filedialog.askopenfilename()
ஒரு ஃபைலை செலெக்ட் செய்து ஒபன் பட்டனை கிளிக் செய்தவுடன் file வேரியபிள் ஆனது அதன் பாத்தைக் கொண்டுருக்கும்
ஒன்றுக்கு மேற்பட்ட ஃபைல்களை கேட்பதற்கு பின் வருமாறு பயன்படுத்தலாம்.
files = filedialog.askopenfilenames()
File Types (Filter File Extensions)குறிப்பிடுதல்
filetypes பராமீட்டருக்கு அதன் எக்ஸ்டண்சனை குறிப்பிடுவதன் மூலம் டயலாக்பாக்ஸ் எந்த வகையான ஃபைல்களை காட்ட வேண்டும் என ஃபில்டர் செய்யலாம்.
file = filedialog.askopenfilename(filetypes = (("Text files","*.txt"),("all files","*.*")))
அதே போல் டைரக்டரியை செலக்ட் செய்வதற்கு askdirectory  பயன்படுகின்றது.
dir = filedialog.askdirectory()
தொடக்க டைரக்டரியாக initialdir என்ற பண்பிற்கு மதிப்பிருத்தலாம்.
from os import path
file = filedialog.askopenfilename(initialdir= path.dirname(__file__))
Menu Bar உருவாக்குதல்
இதற்கு பின் வருமாறு நிரல் எழுதலாம்.
from tkinter import Menu
menu = Menu(window)
menu.add_command(label='File')
window.config(menu=menu)
முதலில் ஒரு மெனுவை உருவாக்கி பிறகு லேபள்  சேர்த்து முடிவாக நம் விண்டோவின் மெனுவாக குறிப்பிடலாம்.
மெனு ஐட்டம்களை உருவாக்குவதற்கு  add_cascade()என்ற ஃபங்க்சனை பயன்படுத்தலாம்.
menu.add_cascade(label='File', menu=new_item)
சான்று நிரல்
from tkinter import *
from tkinter import Menu
window = Tk()
window.title("Welcome to LikeGeeks app")
menu = Menu(window)
new_item = Menu(menu)
new_item.add_command(label='New')
menu.add_cascade(label='File', menu=new_item)
window.config(menu=menu)
window.mainloop()
பின் வருமாறு நிறைய மெனு ஐட்டம்களை பயன்படுத்தலாம்.
from tkinter import *
from tkinter import Menu
window = Tk()
window.title("Welcome to LikeGeeks app")
menu = Menu(window)
new_item = Menu(menu)
new_item.add_command(label='New')
new_item.add_separator()
new_item.add_command(label='Edit')
menu.add_cascade(label='File', menu=new_item)
window.config(menu=menu)
window.mainloop()
இங்கு இன்னொரு Edit என்கின்ற மெனு ஐட்டம் உருவாக்கலாம்.
தொடக்கத்தில் ஒரு dashed line காணலாம் இதை கிளிக் செய்யும் பொழுது மெனு ஐட்டம்கள் தனி விண்டோவில் காண்பிக்கப்படும்.
இதை டிஸேபிள் செய்வதற்கு tearoff என்ற அம்சம் பயன்படுகின்றது.
new_item = Menu(menu, tearoff=0)
மெனு ஐட்டத்தை கிளிக் செய்யும் பொழுது எந்த ஃபங்க்சன் இயக்கப்பட வேண்டுமென்று  command பிராப்பர்டியில் குறிப்பிடலாம்
new_item.add_command(label='New', command=clicked)
Notebook Widget (Tab Control)
To create a tab control, there are a few steps.
  • முதலில் Notebook கிளாஸ் உபயோகப்படுத்திஒரு tab control  உருவாக்கவும்.
  • Frame என்ற கிளாஸ் பயன்படுத்தி tab உருவாக்கவும்.
  • Tab ஆனதை the tab control –ல் சேர்க்கவும்.
டேப் கன்ட்ரோலை pack செய்யவும்
from tkinter import *
from tkinter import ttk
window = Tk()
window.title("Welcome to LikeGeeks app")
tab_control = ttk.Notebook(window)
tab1 = ttk.Frame(tab_control)
tab_control.add(tab1, text='First')
tab_control.pack(expand=1, fill='both')
window.mainloop()
.
Notebooks கருவிகள் சேர்த்தல்
Tabs உருவாக்கிய பிறகு அதன் உள்ளே என்ன இருக்க வேண்டுமென்று பின் வருமாறு நிரல் எழுதலாம்.
from tkinter import *
from tkinter import ttk
window = Tk()
window.title("Welcome to LikeGeeks app")
tab_control = ttk.Notebook(window)
tab1 = ttk.Frame(tab_control)
tab2 = ttk.Frame(tab_control)
tab_control.add(tab1, text='First')
tab_control.add(tab2, text='Second')
lbl1 = Label(tab1, text= 'label1')
lbl1.grid(column=0, row=0)
lbl2 = Label(tab2, text= 'label2')
lbl2.grid(column=0, row=0)
tab_control.pack(expand=1, fill='both')
window.mainloop()
Spacing for Widgets (Padding)
padx மற்றும் pady பயன்படுத்தி கண்ட்ரோல்களுக்கு padding குறிப்பிடலாம்.

lbl1 = Label(tab1, text= 'label1', padx=5, pady=5)
 நன்றி
முத்து கார்த்திகேயன் ,மதுரை.
ads Udanz

No comments:

Post a Comment