# 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()