在tkinter类中创建另一个窗口

时间:2019-01-19 04:12:57

标签: python python-3.x tkinter

我已经在python中制作了“便签”,但是当我按下新文件(标题栏上的{+)按钮时,如何在另一个窗口中打开它?我曾想在课堂上创建一个对象,但我认为那是不可能的。我应该导入并运行类似文件吗?请提出一种方法。欢迎提出改进代码的建议。

这是代码

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

1 个答案:

答案 0 :(得分:0)

您正在使用所有错误的类。使用类的最大优点之一是能够从Tkinter(或您尝试使用的任何GUI或框架)窃取代码。 Tkinter窗口类称为Toplevel,因此您想对该类进行子类化,并为所有操作使用该类本身(称为“ self”)。我为您重写了它:

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