Питон Ткинтер. Исправлена ​​ошибка атрибута «Объект события не имеет атрибута tk» при использовании привязки для создания нового окна - PullRequest
0 голосов
/ 15 апреля 2019

Я создал строку меню и пытаюсь создать сочетания клавиш для открытия этих ссылок. Ярлык запустит функцию, которая запускает класс. Этот класс создает новое окно. Но я продолжаю получать эту ошибку:

    AttributeError: 'Event' object has no attribute 'tk'

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

Что я не могу понять, так это то, что при нажатии на ссылку в строке меню это работает. В классе TrackComicScreen перед командами связывания.

Вот уменьшенная версия моего кода.

    from tkinter import *

    class TrackComicScreen:
        def __init__(self, master):
            self.master = master
            root.bind("<Control-Shift-A>", self.AddNewEntry)

        def AddNewEntry(self, master):
            addComic(master)

    class addComic:
        def __init__(self, master):
            self.AddNewEntryWindow = Toplevel(master)
            self.AddNewEntryWindow.geometry('460x440')

    #WINDOW PROPERTIES
    root = Tk()
    root.geometry("1074x714")
    currWindow = TrackComicScreen(root)
    root.mainloop()

ОШИБКА Извлечение сообщения

addComic(master)

self.AddNewEntryWindow = Toplevel(master)

BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)

BaseWidget._setup(self, master, cnf)

self.tk = master.tk

AttributeError: 'Event' object has no attribute 'tk'

Ожидаемый результат - при нажатии клавиши Ctrl Shift A. должно появиться новое окно.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Когда вы привязываете функцию к клавише, функция вызывается с одним позиционным параметром, который представляет событие, которое вызвало привязку.

Рассмотрим этот код:

root.bind("<Control-Shift-A>", self.AddNewEntry)

Когда вызывается self.AddNewEntry, tkinter будет вызывать его с одним параметром, который является объектом, представляющим событие (например: self.AddNewEntry(event)). Этот объект имеет такие свойства, как виджет, который получил событие, координаты x / y указателя мыши, нажатая клавиша и т. Д.

Вы назвали этот параметр master, что заставляет меня думать, что вы ожидаете, что этот код каким-то образом представляет главное или корневое окно. И действительно, вы передаете этот параметр в addComic, который затем пытается использовать этот объект события в качестве главного окна для окна Toplevel. Поскольку вы не можете использовать объект события как мастер для другого окна, вы получаете сообщение об ошибке.

Хотя вы можете изменить привязку, передав master функции, поскольку вы храните master в качестве атрибута класса, вам не нужно это делать - AddNewEntry уже знает, что master является.

Решение состоит в том, чтобы переписать AddNewEntry, чтобы принять параметр event и игнорировать его, и передать self.master до addComic:

def AddNewEntry(self, event):
    addComic(self.master)
1 голос
/ 15 апреля 2019

bind генерирует событие при вызове, которое затем передается функции обратного вызова.Итак, короче говоря, вы делаете:

def AddNewEntry(self, event):
    addComic(event)

И событие не может быть хозяином Toplevel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...