Практика структуры классов Python Tkinter

#game class
import Tkinter as tk

class Game(tk.Canvas):

    def __init__(self, master):

        canvas = tk.Canvas(master)
        canvas.pack()

        button = tk.Button(canvas, text='Quit', command=self.quit_game)
        button.pack()

    def quit_game(self):
        root.destroy()#Should i put something else here?


root = tk.Tk()

game = Game(root)

root.mainloop()

Это хорошая практика, или, другими словами, есть проблема с наследованием от холста напрямую вместо фрейма, если, например, я не собираюсь добавлять никакие виджеты, кроме холста?

Еще один вопрос, который у меня есть, касается root.destroy(). Я не понимаю, почему я не могу сказать master.destroy() или что-то в этом роде.


person Rastko Jović    schedule 16.02.2016    source источник


Ответы (1)


Нет ничего плохого в наследовании от Canvas или любого другого виджета Tkinter.

re master.destroy() vs root.destroy(): вы можете называть это как хотите. Вам просто нужна ссылка на корневое окно. Если вы назовете его root, чтобы уничтожить его, вы должны позвонить root.destroy().

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

class Game(tk.Canvas):

    def __init__(self, master):
        self.master = master
        ...
    def quit_game(self):
        self.master.destroy()
person Bryan Oakley    schedule 16.02.2016