├── DrawingApp.py ├── ImageViewer.py ├── README.md ├── TextEditor.py └── tkinter-LoginForm-Sqlite3.py /DrawingApp.py: -------------------------------------------------------------------------------- 1 | from tkinter import * 2 | from tkinter import ttk, colorchooser, filedialog 3 | import PIL 4 | from PIL import ImageGrab 5 | 6 | 7 | class main: 8 | def __init__(self,master): 9 | self.master = master 10 | self.color_fg = 'black' 11 | self.color_bg = 'white' 12 | self.old_x = None 13 | self.old_y = None 14 | self.penwidth = 5 15 | self.drawWidgets() 16 | self.c.bind('',self.paint) 17 | self.c.bind('',self.reset) 18 | 19 | def paint(self,e): 20 | if self.old_x and self.old_y: 21 | self.c.create_line(self.old_x,self.old_y,e.x,e.y,width=self.penwidth,fill=self.color_fg,capstyle=ROUND,smooth=True) 22 | 23 | self.old_x = e.x 24 | self.old_y = e.y 25 | 26 | def reset(self,e): 27 | self.old_x = None 28 | self.old_y = None 29 | 30 | def changeW(self,e): 31 | self.penwidth = e 32 | 33 | def save(self): 34 | file = filedialog.asksaveasfilename(filetypes=[('Portable Network Graphics','*.png')]) 35 | if file: 36 | x = self.master.winfo_rootx() + self.c.winfo_x() 37 | y = self.master.winfo_rooty() + self.c.winfo_y() 38 | x1 = x + self.c.winfo_width() 39 | y1 = y + self.c.winfo_height() 40 | 41 | PIL.ImageGrab.grab().crop((x,y,x1,y1)).save(file + '.png') 42 | 43 | 44 | 45 | def clear(self): 46 | self.c.delete(ALL) 47 | 48 | def change_fg(self): 49 | self.color_fg=colorchooser.askcolor(color=self.color_fg)[1] 50 | 51 | def change_bg(self): 52 | self.color_bg=colorchooser.askcolor(color=self.color_bg)[1] 53 | self.c['bg'] = self.color_bg 54 | 55 | def drawWidgets(self): 56 | self.controls = Frame(self.master,padx = 5,pady = 5) 57 | Label(self.controls, text='Pen Width: ',font=('',15)).grid(row=0,column=0) 58 | self.slider = ttk.Scale(self.controls,from_= 5, to = 100, command=self.changeW,orient=HORIZONTAL) 59 | self.slider.set(self.penwidth) 60 | self.slider.grid(row=0,column=1,ipadx=30) 61 | self.controls.pack() 62 | 63 | self.c = Canvas(self.master,width=500,height=400,bg=self.color_bg,) 64 | self.c.pack(fill=BOTH,expand=True) 65 | 66 | menu = Menu(self.master) 67 | self.master.config(menu=menu) 68 | filemenu = Menu(menu) 69 | menu.add_cascade(label='File..',menu=filemenu) 70 | filemenu.add_command(label='Export..',command=self.save) 71 | colormenu = Menu(menu) 72 | menu.add_cascade(label='Colors',menu=colormenu) 73 | colormenu.add_command(label='Brush Color',command=self.change_fg) 74 | colormenu.add_command(label='Background Color',command=self.change_bg) 75 | optionmenu = Menu(menu) 76 | menu.add_cascade(label='Options',menu=optionmenu) 77 | optionmenu.add_command(label='Clear Canvas',command=self.clear) 78 | optionmenu.add_command(label='Exit',command=self.master.destroy) 79 | 80 | 81 | 82 | if __name__ == '__main__': 83 | root = Tk() 84 | main(root) 85 | root.title('DrawingApp') 86 | root.mainloop() 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /ImageViewer.py: -------------------------------------------------------------------------------- 1 | #Created by namah jain From All About Code (youtube channel) 2 | # Channel Link : https://www.youtube.com/channel/UCUGAq4ALoWW4PDU6Cm1riSg?view_as=subscriber 3 | # Simple Image Viewer using tkinter and Python PILLOW library 4 | 5 | #Imports 6 | from tkinter import * #download using pip(pip install tkinter) or (in linux) sudo apt-get install python3-tk 7 | from tkinter import filedialog as fd 8 | from tkinter import messagebox as ms 9 | import PIL #pip install pillow 10 | from PIL import ImageTk, Image 11 | 12 | # Main Class --Application-- 13 | class application: 14 | #Constructer 15 | def __init__(self,master): 16 | #self.master is our root window 17 | self.master = master 18 | #Canvas Size 19 | self.c_size = (700,500) 20 | #Creates All Of Our Widgets 21 | self.setup_gui(self.c_size) 22 | self.img=None 23 | 24 | #Making Widgets 25 | def setup_gui(self,s): 26 | Label(self.master,text = 'Image Viewer',pady=5,bg='white', 27 | font=('Ubuntu',30)).pack() 28 | self.canvas = Canvas(self.master,height=s[1],width=s[0], 29 | bg='black',bd=10,relief='ridge') 30 | self.canvas.pack() 31 | txt = ''' 32 | ! 33 | No Image 34 | ''' 35 | #Text On Canvas Saying No Current Image Open. 36 | self.wt = self.canvas.create_text(s[0]/2-270,s[1]/2,text=txt 37 | ,font=('',30),fill='white') 38 | f=Frame(self.master,bg='white',padx=10,pady=10) 39 | Button(f,text='Open New Image',bd=2,fg='white',bg='black',font=('',15) 40 | ,command=self.make_image).pack(side=LEFT) 41 | f.pack() 42 | #Status Bar 43 | self.status=Label(self.master,text = 'Current Image: None',bg='gray', 44 | font=('Ubuntu',15),bd=2,fg='black',relief='sunken',anchor=W) 45 | self.status.pack(side=BOTTOM,fill=X) 46 | 47 | 48 | def make_image(self): 49 | try: 50 | #Open Image File 51 | File = fd.askopenfilename() 52 | self.pilImage = Image.open(File) 53 | # Resize Image According To Canvas 54 | re=self.pilImage.resize((700,500),Image.ANTIALIAS) 55 | self.img = ImageTk.PhotoImage(re) 56 | # Delete all canvas content(text,image) 57 | self.canvas.delete(ALL) 58 | #Create Image 59 | self.canvas.create_image(self.c_size[0]/2+10,self.c_size[1]/2+10, 60 | anchor=CENTER,image=self.img) 61 | # Update Status Bar 62 | self.status['text']='Current Image:'+File 63 | except: 64 | # show error in case of error 65 | ms.showerror('Error!','File type is unsupported.') 66 | 67 | if __name__ == '__main__': 68 | # Create Object And Run Programme 69 | root=Tk() 70 | root.configure(bg='white') 71 | root.title('Image Viewer') 72 | application(root) 73 | root.resizable(0,0) 74 | root.mainloop() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-Tkinter-Projects 2 |

All of our python's tkinter projects from Youtube Channel All-About-Code. 3 | 4 | Channel Link:- 5 | https://www.youtube.com/channel/UCUGAq4ALoWW4PDU6Cm1riSg?view_as=subscriber 6 | 7 | All Of Them are made using Python-3 and tkinter Module 8 | 9 |

Tkinter Installation

:- 10 |
    11 |
  • Windows: Comes Defalut With Python 12 | 13 |
  • Ubuntu (or Based): sudo apt-get install python3-tk #Run in terminal 14 |

15 | Hope You All Like It 16 | 17 | 18 |

19 | Please Subscribe To Our Channel If You Did. 20 | 21 | Post issues if you have any. 22 | 23 | Thank You. 24 |

25 | 26 | -------------------------------------------------------------------------------- /TextEditor.py: -------------------------------------------------------------------------------- 1 | from Tkinter import * 2 | import tkColorChooser, tkMessageBox 3 | from tkFileDialog import * 4 | import ScrolledText as sc 5 | from tkfontchooser import askfont 6 | 7 | class main: 8 | def __init__(self,master): 9 | self.master = master 10 | self.filename = 'Untitled' 11 | self.updateTitle() 12 | self.widgets() 13 | self.menubar() 14 | 15 | def updateTitle(self): 16 | print self.filename 17 | self.master.title(self.filename+": "+'DouchePad') 18 | 19 | def menubar(self): 20 | self.menu = Menu(root) 21 | self.master.config(menu=self.menu) 22 | filemenu = Menu(self.menu) 23 | self.menu.add_cascade(label="File", menu=filemenu) 24 | filemenu.add_command(label="New", command=self.NewFile) 25 | filemenu.add_command(label="Open", command=self.opn) 26 | filemenu.add_command(label="Save", command=self.save) 27 | filemenu.add_command(label="Save As..", command=self.saveas) 28 | filemenu.add_separator() 29 | filemenu.add_command(label="Exit", command=self.quit) 30 | 31 | Config = Menu(self.menu) 32 | self.menu.add_cascade(label="Config", menu=Config) 33 | Config.add_command(label="Font",command=self.chfont) 34 | Config.add_command(label="Text Color",command=self.txtcolor) 35 | bt = Menu(Config) 36 | bt.add_command(label='Black Theme',command=self.black) 37 | bt.add_command(label='White Theme',command=self.defalut) 38 | Config.add_cascade(label="Background Theme",menu=bt) 39 | helpmenu = Menu(self.menu) 40 | self.menu.add_cascade(label="Help", menu=helpmenu) 41 | helpmenu.add_command(label="About...", command=self.about) 42 | 43 | def black(self): 44 | self.ta['insertbackground'] = 'white' 45 | self.ta['bg'] = 'black' 46 | self.ta['fg'] = 'white' 47 | 48 | def defalut(self): 49 | self.ta['insertbackground'] = 'black' 50 | self.ta['bg'] = 'white' 51 | self.ta['fg'] = 'black' 52 | 53 | def quit(self): 54 | if tkMessageBox.askyesno("Save","Do you want to save the file before closing."): 55 | self.save() 56 | quit() 57 | 58 | def about(self): 59 | pass 60 | 61 | def txtcolor(self): 62 | color = tkColorChooser.askcolor('black') 63 | if color: 64 | self.ta['fg'] = color[1] 65 | 66 | def chfont(self): 67 | font = askfont(self.master) 68 | if font: 69 | font['family'] = font['family'].replace(' ', '\ ') 70 | font_str = "%(family)s %(size)i %(weight)s %(slant)s" % font 71 | if font['underline']: 72 | font_str += ' underline' 73 | if font['overstrike']: 74 | font_str += ' overstrike' 75 | self.ta['font'] = font_str 76 | 77 | self.ta['height'] = self.ta['height']-font['size'] 78 | self.ta['width'] = self.ta['width']-font['size'] 79 | 80 | def widgets(self): 81 | self.master.protocol("WM_DELETE_WINDOW",self.quit) 82 | self.ta = sc.ScrolledText(self.master,height=40,width=100) 83 | self.ta.pack(expand=True,fill=BOTH) 84 | 85 | self.ta.bind('',self.opn) 86 | self.ta.bind('',self.NewFile) 87 | self.ta.bind('',self.save) 88 | self.ta.bind('',self.select_all) 89 | self.ta.bind('',self.select_all) 90 | 91 | def NewFile(self,event=None): 92 | if tkMessageBox.askyesno("New","Do you want to save the file..."): 93 | self.save() 94 | 95 | self.ta.delete(0.0, END) 96 | self.filename = "Untitled" 97 | self.updateTitle() 98 | 99 | def select_all(self,event=None): 100 | self.ta.tag_add(SEL, "1.0", END) 101 | self.ta.focus_set() 102 | 103 | def opn(self,event=None): 104 | File = str(askopenfilename(title="Open File",filetypes=[("all files","*.*"), 105 | ('CSS','.css'),('HTML','.html'),('PYTHON','.py')])) 106 | if len(File) > 0: 107 | self.ta.delete("1.0",END) 108 | try: 109 | f = open(File) 110 | for line in f: 111 | self.ta.insert(END,line) 112 | f.close() 113 | self.filename = str(File) 114 | self.updateTitle() 115 | except IOError: 116 | tkMessageBox.showwarning("Open file","Cannot open this file...") 117 | 118 | def save(self,event=None): 119 | if self.filename == 'Untitled': 120 | self.saveas() 121 | else: 122 | f = open(self.filename,"w") 123 | text = self.ta.get("1.0",END).encode("utf-8") 124 | f.write(text) 125 | f.close() 126 | self.updateTitle() 127 | 128 | def saveas(self,event=None): 129 | file=str(asksaveasfilename(title="Save as File",defaultextension=".txt",filetypes=[("all files","*.*"), 130 | ('CSS','.css'),('HTML','.html'),('PYTHON','.py')])) 131 | if len(file)>0: 132 | f = open(file,'w') 133 | text = self.ta.get("1.0",END).encode("utf-8") 134 | f.write(text) 135 | f.close() 136 | self.filename = file 137 | self.updateTitle() 138 | 139 | root = Tk() 140 | main(root) 141 | root.mainloop() 142 | -------------------------------------------------------------------------------- /tkinter-LoginForm-Sqlite3.py: -------------------------------------------------------------------------------- 1 | # Python Tkinter and Sqlite3 Login Form 2 | # Made By Namah Jain Form Youtube Channel All About Code 3 | # Please Subscribe To Our Youtube Channel. 4 | # https://www.youtube.com/channel/UCUGAq4ALoWW4PDU6Cm1riSg?view_as=subscriber 5 | 6 | # imports 7 | from tkinter import * 8 | from tkinter import messagebox as ms 9 | import sqlite3 10 | 11 | # make database and users (if not exists already) table at programme start up 12 | with sqlite3.connect('quit.db') as db: 13 | c = db.cursor() 14 | 15 | c.execute('CREATE TABLE IF NOT EXISTS user (username TEXT NOT NULL PRIMARY KEY,password TEXT NOT NULL);') 16 | db.commit() 17 | db.close() 18 | 19 | 20 | # main Class 21 | class Main: 22 | def __init__(self, master): 23 | # Window 24 | self.master = master 25 | # Some Useful variables 26 | self.username = StringVar() 27 | self.password = StringVar() 28 | self.n_username = StringVar() 29 | self.n_password = StringVar() 30 | self.head = None 31 | self.logf = None 32 | self.crf = None 33 | # Create Widgets 34 | self.widgets() 35 | # Sets up the database 36 | self.db2 = None 37 | # Holds database information 38 | self.db = None 39 | self.db_connection() 40 | 41 | # Open Database connection 42 | def db_connection(self): 43 | with sqlite3.connect('quit.db') as self.db2: 44 | self.db = self.db2.cursor() 45 | 46 | # Close Database connection 47 | def db_close_connection(self): 48 | self.db.close() 49 | 50 | # Login Function 51 | def login(self): 52 | # Establish Connection 53 | # Moved to db_connection() 54 | # Find user If there is any take proper action 55 | find_user = 'SELECT * FROM user WHERE username = ? and password = ?' 56 | self.db.execute(find_user, [(self.username.get()), (self.password.get())]) 57 | result = self.db.fetchall() 58 | if result: 59 | self.logf.pack_forget() 60 | self.head['text'] = self.username.get() + '\n Loged In' 61 | self.head['pady'] = 150 62 | else: 63 | ms.showerror('Oops!', 'Username Not Found.') 64 | 65 | def new_user(self): 66 | # Establish Connection 67 | # Moved to db_connection() 68 | 69 | # Find Existing username if any take proper action 70 | find_user = 'SELECT username FROM user WHERE username = ?' 71 | self.db.execute(find_user, [(self.n_username.get())]) 72 | if self.db.fetchall(): 73 | ms.showerror('Error!', 'Username Taken Try a Different One.') 74 | else: 75 | ms.showinfo('Success!', 'Account Created!') 76 | self.log() 77 | # Create New Account 78 | insert = 'INSERT INTO user(username,password) VALUES(?,?)' 79 | self.db.execute(insert, [(self.n_username.get()), (self.n_password.get())]) 80 | self.db2.commit() 81 | 82 | # Frame Packing Methods 83 | 84 | def log(self): 85 | self.username.set('') 86 | self.password.set('') 87 | self.crf.pack_forget() 88 | self.head['text'] = 'LOGIN' 89 | self.logf.pack() 90 | 91 | def cr(self): 92 | self.n_username.set('') 93 | self.n_password.set('') 94 | self.logf.pack_forget() 95 | self.head['text'] = 'Create Account' 96 | self.crf.pack() 97 | 98 | # Draw Widgets 99 | def widgets(self): 100 | self.head = Label(self.master, text='LOGIN', font=('', 35), pady=10) 101 | self.head.pack() 102 | self.logf = Frame(self.master, padx=10, pady=10) 103 | Label(self.logf, text='Username: ', font=('', 20), pady=5, padx=5).grid(sticky=W) 104 | Entry(self.logf, textvariable=self.username, bd=5, font=('', 15)).grid(row=0, column=1) 105 | Label(self.logf, text='Password: ', font=('', 20), pady=5, padx=5).grid(sticky=W) 106 | Entry(self.logf, textvariable=self.password, bd=5, font=('', 15), show='*').grid(row=1, column=1) 107 | Button(self.logf, text=' Login ', bd=3, font=('', 15), padx=5, pady=5, command=self.login).grid() 108 | Button(self.logf, text=' Create Account ', bd=3, font=('', 15), padx=5, pady=5, command=self.cr).grid(row=2, 109 | column=1) 110 | self.logf.pack() 111 | 112 | self.crf = Frame(self.master, padx=10, pady=10) 113 | Label(self.crf, text='Username: ', font=('', 20), pady=5, padx=5).grid(sticky=W) 114 | Entry(self.crf, textvariable=self.n_username, bd=5, font=('', 15)).grid(row=0, column=1) 115 | Label(self.crf, text='Password: ', font=('', 20), pady=5, padx=5).grid(sticky=W) 116 | Entry(self.crf, textvariable=self.n_password, bd=5, font=('', 15), show='*').grid(row=1, column=1) 117 | Button(self.crf, text='Create Account', bd=3, font=('', 15), padx=5, pady=5, command=self.new_user).grid() 118 | Button(self.crf, text='Go to Login', bd=3, font=('', 15), padx=5, pady=5, command=self.log).grid(row=2, 119 | column=1) 120 | 121 | 122 | if __name__ == '__main__': 123 | # Create Object 124 | # and setup window 125 | root = Tk() 126 | root.title('Login Form') 127 | # root.geometry('400x350+300+300') 128 | running = Main(root) 129 | root.mainloop() 130 | running.db_close_connection() 131 | --------------------------------------------------------------------------------