Перемещение переопределенного окна верхнего уровня, позволяющего минимизировать - PullRequest
0 голосов
/ 02 апреля 2020

Добрый день,

Я пытался реализовать скрипт на этой странице: Tkinter: перетаскивание мышью окна без границ, например. overridedirect (1)

Для работы с моим окном верхнего уровня tkinter. Вот как инициализируется мое окно tkinter:

    def __init__(self, master=None):
        tkinter.Tk.__init__(self, master)

Затем я скрываю окно root и запускаю окно верхнего уровня. Что я делаю так, что в настоящее время я могу свернуть и снова открыть окно верхнего уровня.

    #Hide Root
    self.attributes("-alpha",0.0)
    self.attributes("-topmost", True)

    #Top Level Window
    top_level = tkinter.Toplevel(self)
    top_level.geometry("600x300")
    top_level.overrideredirect(True)
    top_level.config(bg="#1e1e1e")

Теперь я пытаюсь заставить окно двигаться, используя этот кусок кода здесь со страницы, указанной выше. (Я изменил некоторые переменные, чтобы они соответствовали моему окну)

    top_level.bind("<ButtonPress-1>", top_level.StartMove)
    top_level.bind("<ButtonRelease-1>", top_level.StopMove)
    top_level.bind("<B1-Motion>", top_level.OnMotion)

def StartMove(top_level, event):
    top_level.x = event.x
    top_level.y = event.y

def StopMove(top_level, event):
    top_level.x = None
    top_level.y = None

def OnMotion(top_level, event):
    deltax = event.x - top_level.x
    deltay = event.y - top_level.y
    x = top_level.winfo_x() + deltax
    y = top_level.winfo_y() + deltay
    top_level.geometry("+%s+%s" % (x, y))

Это ошибка, которую я получаю:

Traceback (most recent call last):
  File "E:/Programs/TestGUI/script_gui.py", line 2, in <module>
    import authenticator
  File "E:\Programs\TestGUI\authenticator.py", line 148, in <module>
    root = Win()
  File "E:\Programs\TestGUI\authenticator.py", line 127, in __init__
    top_level.bind("<ButtonPress-1>", top_level.StartMove)
AttributeError: 'Toplevel' object has no attribute 'StartMove'

Любая помощь будет принята с благодарностью, так как это одна из последних вещей, которые мне нужно сделать, чтобы завершить sh этот проект.

Спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Согласно сообщению об ошибке, у вас есть имя класса Win, которое получено из tkinter.Tk. Таким образом, все функции в опубликованном коде находятся внутри этого класса.

Затем три строки:

top_level.bind("<ButtonPress-1>", top_level.StartMove)
top_level.bind("<ButtonRelease-1>", top_level.StopMove)
top_level.bind("<B1-Motion>", top_level.OnMotion)

должны быть изменены на:

self.top_level.bind("<ButtonPress-1>", self.StartMove)
self.top_level.bind("<ButtonRelease-1>", self.StopMove)
self.top_level.bind("<B1-Motion>", self.OnMotion)

top_level должна быть лучше переменная экземпляра класса, чтобы к ней могли обращаться другие методы класса:

self.top_level = tkinter.Toplevel(self)
self.top_level.geometry('600x300')
self.top_level.overrideredirect(1)
self.top_level.config(bg='#1e1e1e')

Также обычно имя первого аргумента методов класса StartMove(), StopMove() и OnMotion() это self. И эти функции должны быть изменены, чтобы обеспечить изменение top_level с локальной переменной на переменную экземпляра:

def StartMove(self, event):
    self.top_level.x = event.x
    self.top_level.y = event.y

def StopMove(self, event):
    self.top_level.x = self.top_level.y = None

def OnMotion(self, event):
    deltax = event.x - self.top_level.x
    deltay = event.y - self.top_level.y
    x = self.top_level.winfo_x() + deltax
    y = self.top_level.winfo_y() + deltay
    self.top_level.geometry('+%s+%s' % (x, y))

Ниже приведено определение класса Win:

class Win(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        #Hide Root
        self.attributes('-alpha', 0.0)
        self.attributes('-topmost', 1)

        #Top Level Window
        self.top_level = tkinter.Toplevel(self)
        self.top_level.geometry('600x300')
        self.top_level.overrideredirect(1)
        self.top_level.config(bg='#1e1e1e')
        self.top_level.bind('<ButtonPress-1>', self.StartMove)
        self.top_level.bind('<ButtonRelease-1>', self.StopMove)
        self.top_level.bind('<B1-Motion>', self.OnMotion)

    def StartMove(self, event):
        self.top_level.x = event.x
        self.top_level.y = event.y

    def StopMove(self, event):
        self.top_level.x = self.top_level.y = None

    def OnMotion(self, event):
        deltax = event.x - self.top_level.x
        deltay = event.y - self.top_level.y
        x = self.top_level.winfo_x() + deltax
        y = self.top_level.winfo_y() + deltay
        self.top_level.geometry('+%s+%s' % (x, y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...