Welcome, guest | Sign In | My Account | Store | Cart
# Version 0.2
# Author: Miguel Martinez Lopez
# Email: To see my email uncomment the next line
# print '61706c69636163696f6e616d656469646140676d61696c2e636f6d'.decode('hex')

import Tkinter as Tk

class DraggableWindow(object):

	def __init__(self, disabled =False, release_command = None):
		if disabled == False:
			self.bind('<Button-1>', self.initiate_motion)
			self.bind('<ButtonRelease-1>', self.release_dragging)

		self.release_command = release_command
	
	
	def initiate_motion(self, event) :
		mouse_x, mouse_y = self.winfo_pointerxy()

		self.deltaX = mouse_x - self.winfo_x()
		self.deltaY = mouse_y - self.winfo_y()

		self.bind('<Motion>', self.drag_window)

		
	def drag_window (self, event) :
		mouse_x, mouse_y = self.winfo_pointerxy()

		new_x = mouse_x - self.deltaX
		new_y = mouse_y - self.deltaY

		if new_x < 0 :
			new_x = 0

		if new_y < 0 :
			new_y = 0

		self.wm_geometry("+%s+%s" % (new_x, new_y))

	def release_dragging(self, event):
		self.unbind('<Motion>')
		
		if self.release_command != None :
			self.release_command()

	def disable(self) :
		self.unbind('<Button-1>')
		self.unbind('<ButtonRelease-1>')
		self.unbind('<Motion>')
		
	def enable(self):
		self.bind('<Button-1>', self.initiate_motion)
		self.bind('<ButtonRelease-1>', self.release_dragging)		



class DesktopNote(Tk.Toplevel, DraggableWindow):
	BG_NOTE = '#%02x%02x%02x' % (255, 255, 125)
	
	def __init__(self, parent, title='Without title', min_width =10, min_height = 3):
		self.min_width = min_width
		self.min_height = min_height
		
		Tk.Toplevel.__init__(self, parent)
		DraggableWindow.__init__(self)
		
		self.overrideredirect(True)


		frameNote = Tk.Frame(self, bg=self.BG_NOTE, bd=1, highlightbackground='black',highlightcolor='black',highlightthickness=1)
		frameNote.pack()

		self.mimizedNote = Tk.Label(frameNote, text=title, bg=self.BG_NOTE, wraplength=1)
		self.mimizedNote.bind('<Button-1>', lambda event: self.side_maximize())

		
		self.maximizedNote = Tk.Frame(frameNote)
		self.maximizedNote.pack()
		
		Header = Tk.Frame(self.maximizedNote, bg=self.BG_NOTE)
		Header.pack(fill=Tk.X)

		HR = Tk.Frame(self.maximizedNote,bg='black', height=1)
		HR.pack(padx=1, fill=Tk.X)
		titleLabel = Tk.Label(Header, text = title, bg=self.BG_NOTE)
		titleLabel.pack(side=Tk.LEFT)
		self.noteclos = Tk.PhotoImage(file="noteclos.gif")
		Tk.Button(Header, compound=Tk.TOP, image=self.noteclos, bg=self.BG_NOTE,activebackground=self.BG_NOTE, command= self.destroy).pack(side=Tk.RIGHT)
		self.notemini = Tk.PhotoImage(file="notemini.gif")
   		self.iconifyButton = Tk.Button(Header, image=self.notemini, command=self.minimize,  bg=self.BG_NOTE, activebackground=self.BG_NOTE)
		self.iconifyButton.pack(side=Tk.RIGHT)
		self.minright = Tk.PhotoImage(file="minright.gif")
		Tk.Button(Header, compound=Tk.TOP, image=self.minright, bg=self.BG_NOTE,activebackground=self.BG_NOTE, command= self.side_minimize).pack(side=Tk.RIGHT)
		
		self.text_box = Tk.Text(self.maximizedNote, bd=0, bg=self.BG_NOTE, width=self.min_width, height=self.min_height)
		self.text_box.pack(expand=Tk.YES, fill=Tk.BOTH)
		self.text_box.bind("<Key>", self.update_size)

		self.noterest = Tk.PhotoImage(file="noterest.gif")
		
	def side_minimize(self):
		self.disable()
		self.maximizedNote.pack_forget()
		self.mimizedNote.pack()
		self.x = self.winfo_x()
		self.y = self.winfo_y()
		self.wm_geometry('-0+%d'%self.y)

		
	def side_maximize(self):
		self.maximizedNote.pack()
		self.mimizedNote.pack_forget()
		self.wm_geometry('+%d+%d'% (self.x,self.y))
		self.enable()
		
	def minimize(self):
		self.text_box.pack_forget()
		self.iconifyButton['command'] = self.maximize
		self.iconifyButton['image'] = self.noterest
		
	def maximize(self):
		self.text_box.pack(expand=Tk.YES, fill=Tk.BOTH)
		self.iconifyButton['command'] = self.minimize
		self.iconifyButton['image'] = self.notemini
		
	def update_size(self, event):
		widget_width = 0
		widget_height = float(event.widget.index(Tk.END))
		for line in event.widget.get("1.0", Tk.END).split("\n"):
			if len(line) > widget_width:
				widget_width = len(line)+1
		widget_width = max(widget_width,self.min_width)
		widget_height = max(widget_height,self.min_height)
		event.widget.config(width=widget_width, height=widget_height)
	
class Test(Tk.Tk):
	def __init__(self):
		self.root = Tk.Tk()
		Tk.Label(self.root,text="Title:").pack(side=Tk.LEFT)
		
		self.title = Tk.StringVar()
		self.title.set('TITLE')
		
		entry_title = Tk.Entry(self.root, textvariable=self.title)
		entry_title.pack(side=Tk.LEFT)
		entry_title.bind('<Return>', lambda event: self.create_note() ) 
		
		Tk.Button(self.root, text="Create another note", command=self.create_note).pack(side=Tk.LEFT)
		
		self.create_note()
	
	def create_note(self):
		New_note = DesktopNote(self.root, self.title.get())
		New_note.text_box.focus()
		
	def run(self):
		self.root.mainloop()

if __name__ == '__main__':
	Test().run()

History