Pratik Parikh
Pratik Parikh

Reputation: 5

Create another window in tkinter class

I have made "sticky notes" in python but how do I make the same open in another window when I press the new File (+ on the title bar) button? I thought of creating an object within the class but I don't think that's possible. Should I import and run similar file? Please suggest a method to do so. Suggestions to improve the code are welcomed.

Here's the code

from tkinter import *
import tkinter.scrolledtext as tkst
from tkinter import messagebox
from tkinter import font

class StickyNotes:
    xclick = 0
    yclick = 0

    def __init__(self,master):

        def get_pos(event):
            self.xclick = event.x
            self.yclick = event.y

        def move_window(event):
            master.geometry('+{0}+{1}'.format(event.x_root-self.xclick, event.y_root-self.yclick))

        def another_window(event):
            pass

        def quit_window(event):
            self.closebutton.config(relief = 'flat', bd = 0)
            if(messagebox.askyesno('Delete Note?','Are you sure you want to delete this note?')):
                master.destroy()
                return
            self.closebutton.config(relief = 'flat', bd = 0, bg = '#F8F7B6')

        # master (root) window
        master.overrideredirect(True)
        master.geometry('250x250')
        master.config(bg = '#838383')
        master.resizable(True,True)

        # titlebar
        self.titlebar = Frame(root, bg = '#F8F796', relief = 'flat', bd = 2)
        self.titlebar.bind('<Button-1>', get_pos)
        self.titlebar.bind('<B1-Motion>', move_window)
        self.titlebar.pack(fill = X, expand = 1, side = TOP)

        self.closebutton = Label(self.titlebar, text = 'X', bg = '#F8F7B6', relief = 'flat')
        self.closebutton.bind('<Button-1>', quit_window)
        self.closebutton.pack(side = RIGHT)

        self.newbutton = Label(self.titlebar, text = '+', bg = '#F8F7B6', relief = 'flat')
        self.newbutton.pack(side = LEFT)
        self.newbutton.bind('<Button-1>', another_window)

        # main text area
        self.mainarea = tkst.ScrolledText(master, bg = '#FDFDCA', font=('Comic Sans MS', 14, 'italic'), relief = 'flat', padx = 5, pady = 10)
        self.mainarea.pack(fill = BOTH, expand = 1)

        # frames to introduce shadows
        self.shadow = Frame(root).pack(side=BOTTOM)
        self.shadow = Frame(root).pack(side=RIGHT)

root = Tk()
root.attributes('-topmost', 'true')
sticky = StickyNotes(root)
root.mainloop()

Upvotes: 0

Views: 229

Answers (1)

Novel
Novel

Reputation: 13729

You are using classes all wrong. One of the biggest advantages to using classes is the ability to steal code from Tkinter (or whatever GUI or framework you are trying to use). The Tkinter window class is called Toplevel, so you want to subclass that and use the class itself (named "self") for all your operations. I rewrote it for you:

from tkinter import *
import tkinter.scrolledtext as tkst
from tkinter import messagebox
from tkinter import font

class StickyNotes(Toplevel):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)
        self.xclick = 0
        self.yclick = 0

        # master (root) window
        self.overrideredirect(True)
        self.geometry('250x250+500+500')
        self.config(bg = '#838383')
        self.attributes('-topmost', 'true')
        self.resizable(True,True)

        # titlebar
        self.titlebar = Frame(self, bg = '#F8F796', relief = 'flat', bd = 2)
        self.titlebar.bind('<Button-1>', self.get_pos)
        self.titlebar.bind('<B1-Motion>', self.move_window)
        self.titlebar.pack(fill = X, expand = 1, side = TOP)

        self.closebutton = Label(self.titlebar, text = 'X', bg = '#F8F7B6', relief = 'flat')
        self.closebutton.bind('<Button-1>', self.quit_window)
        self.closebutton.pack(side = RIGHT)

        self.newbutton = Label(self.titlebar, text = '+', bg = '#F8F7B6', relief = 'flat')
        self.newbutton.pack(side = LEFT)
        self.newbutton.bind('<Button-1>', self.another_window)

        # main text area
        self.mainarea = tkst.ScrolledText(self, bg = '#FDFDCA', font=('Comic Sans MS', 14, 'italic'), relief = 'flat', padx = 5, pady = 10)
        self.mainarea.pack(fill = BOTH, expand = 1)

        # frames to introduce shadows
        self.shadow = Frame(self).pack(side=BOTTOM)
        self.shadow = Frame(self).pack(side=RIGHT)

    def get_pos(self, event):
        self.xclick = event.x
        self.yclick = event.y

    def move_window(self, event):
        self.geometry('+{0}+{1}'.format(event.x_root-self.xclick, event.y_root-self.yclick))

    def another_window(self, event):
        sticky = StickyNotes(root)

    def quit_window(self, event):
        self.closebutton.config(relief = 'flat', bd = 0)
        if(messagebox.askyesno('Delete Note?','Are you sure you want to delete this note?')):
            self.destroy()
            return
        self.closebutton.config(relief = 'flat', bd = 0, bg = '#F8F7B6')

root = Tk()
root.withdraw()
sticky = StickyNotes(root) # make the first note. 
root.mainloop()

Upvotes: 1

Related Questions