在tkinter类中创建另一个窗口

2024-04-19 10:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用python做了“便签”,但是当我按下new File(+在标题栏上)按钮时,如何在另一个窗口中打开同样的便签呢?我想在类中创建一个对象,但我认为这是不可能的。我应该导入并运行类似的文件吗?请建议一种方法。欢迎提出改进准则的建议。你知道吗

这是密码

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

Tags: importselfmastereventtkinterdefrootwindow
1条回答
网友
1楼 · 发布于 2024-04-19 10:27:31

你用错了类。使用类的最大优势之一是能够从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()

相关问题 更多 >