Создать другое окно в классе tkinter - PullRequest
0 голосов
/ 19 января 2019

Я сделал «заметки» в 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 голосов
/ 19 января 2019

Вы используете классы все неправильно.Одним из самых больших преимуществ использования классов является возможность красть код из Tkinter (или любого графического интерфейса или инфраструктуры, которую вы пытаетесь использовать).Окно класса 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...