Использование структуры классов с обработчиками окна удаления протокола Python - PullRequest
1 голос
/ 21 февраля 2012

У меня есть следующая программа, использующая Tkinter в Python. он хорошо работает в простом формате, но выдает ошибки, когда я пытаюсь преобразовать его в классовый подход. Я отслеживаю предыдущий сеанс Tkinter GUI, сохраняя введенные значения в текстовом файле и создавая обработчик для отслеживания конца сеанса. Когда открывается новый сеанс, значение записи из предыдущего сеанса уже отображается в поле ввода

#!usr/bin/env python
from Tkinter import *

# Define input retrieve function for application input
def retrieve_text():
    print(app_entry.get())

def handler():
    f = open("backup.txt", "w")
    f.write(app_entry.get())
    f.close()
    app_win.destroy()

if __name__ == "__main__":

    # Create window (or form)
    app_win = Tk()

    # Create label
    app_label = Label(app_win, text="Enter value")
    app_label.pack()

    # Create entry box
    t = open("backup.txt")
    var1 = t.readlines()
    Text = StringVar()
    Text.set(var1[0])
    app_entry = Entry(app_win,textvariable=Text)
    app_entry.pack()

    # Create button
    app_button = Button(app_win, text="Print Value", command=app_win.retrieve_text)
    app_button.pack()

    app_win.protocol("WM_DELETE_WINDOW", handler)
    # Initialize GUI loop
    app_win.mainloop()

Когда я пытаюсь перейти к подходу на основе классов, я получаю сообщение об ошибке «Экземпляр MyGUI не имеет атрибута с именем protocol». Моя классовая структура выглядит следующим образом:

#!usr/bin/env python
from Tkinter import *

class Tracker(Frame):
    def __init__(self):
        Frame.__init__(self)

        # Create label
        app_label = Label(self, text="Enter value")
        app_label.pack()

        # Create entry box
        t = open("backup.txt")
        var1 = t.readlines()
        Text = StringVar()
        Text.set(var1[0])
        app_entry = Entry(self,textvariable=Text)
        app_entry.pack()
        # Create button
        app_button = Button(self, text="Print Value", command=self.retrieve_text)
        app_button.pack()

        self.entry1 = app_entry.get()

        self.protocol("WM_DELETE_WINDOW", self.handler)

    def retrieve_text():
        print(self.entry1)

    def handler():
        f = open("backup.txt", "w")
        f.write(self.entry1)
        f.close()
        self.destroy()

if __name__ == "__main__":

    # Create window (or form)
    app = Tracker()
    # Initialize GUI loop
    app.mainloop()

Может ли кто-нибудь сказать мне, что я делаю не так? Правильно ли указано местоположение, в котором я указываю "WM_DELETE_WINDOW"?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Ваш класс Tracker - это Frame.

self.protocol ("WM_DELETE_WINDOW", self.handler) # предназначен для использования с Toplevel или корневым окном.

1 голос
/ 21 февраля 2012

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

При этом я могу ответить на вопрос «Где именно я инициализирую команду« WM_DELETE_WINDOW »?».Вы инициализируете его в конструкторе объекта вашего приложения.

class MyApp(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        ...
        self.protocol("WM_DELETE_WINDOW", self.handler)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...