2016-01-29 2 views
0

У меня есть это на самом деле простые и короткие несколько строк кода:Tkinter: Ввод кода в класс Перерывы Python

import Tkinter as tk 

master = tk.Tk() 

w = tk.Canvas(master, width=800, height=600) 
w.pack(side="top", fill="both", expand=True) 

master.mainloop() 

Для readibility, расширенной функциональности, мобильности и других причин, почему я хочу поместить код в класс, как это:

class Example(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.create_window() 
    def create_window(self): 
     self.canvas = tk.Canvas(self, width=800, height=600) 
     self.canvas.pack(side="top", fill="both", expand=True) 


if __name__ == "__main__": 
    app = Example() 
    app.mainloop() 

код работает нормально, так же, как предыдущий, но когда я остановить программу я получаю «Python перестал работать» сообщение. Это не влияет на саму программу, но я хочу знать, что ее вызывает, и почему она отлично работает вне класса.

+1

Что значит остановиться? – Natecat

+0

как вы запускаете этот код? непосредственно в терминале/консоли/cmd.exe или в IDE/IDLE? – furas

+0

Когда я нажимаю X или останавливаю его из cmd.exe. – user1234259

ответ

0

Tkinter's Tk и другие классы имеют сотни методов и атрибутов. Я знаю, что если вы читаете древние GUI-программы для книг, со времен Windows 3.x, рекомендация по созданию собственной Windows должна заключаться в подклассе виджета базовой библиотеки и wrtite yoru-кода. Это то, что вы пытаетесь сделать выше, путем подклассификации Tk.

ну, не делаем это. Действительно, не надо. Таким образом, вы не можете создать какой-либо атрибут в своем классе без тройной проверки, если он не сталкивается с каким-либо другим атрибутом.

Используйте приспособление в OO, чтобы создать свою собственную иерархию классов - и это релевантная и упорядоченная вещь, которая облегчит вам жизнь. Чтобы наследовать из окна GUI-кода «Window» и присоединить к нему членов, например «name_text_entry» и «name_variable» (и повторить это для каждого элемента управления в вашей программе), это вещь, которую легко воспринимать как смешивание самых разных вещей (атрибуты управления окном и методы) с внутренней обработкой вашей собственной программы. Here is a more extensive consideration о том, почему этот шаблон не работает (не в Python, но я только что выбрал его из первых результатов Google)

Итак, просто создайте свою собственную программу и оставите классы Tkinter в одиночку - если вы не создаете новый пользовательский виджет (для использования в другой части кода).

Ваш код должен быть больше похож:

class Example(object): 
    def __init__(self, *args, **kw): 
     self.tk = tk.Tk(*args, **kw) 
     self.create_window() 

    def create_window(self): 
     self.canvas = tk.Canvas(self, width=800, height=600) 
     self.canvas.pack(side="top", fill="both", expand=True) 

И просто работать. Сообщение об ошибке, как видно из комментариев, не является детерминированным и может быть получено множеством разных факторов - от tkinter.Tk внутренне в зависимости от того, не является ли оно подклассом (даже если это ошибка), к которому он имеет внутренний " холст "и т. д.

Просто используйте композицию и будьте счастливы.

Смежные вопросы