Не вопрос.
1. Импорты так делать не нужно. Если уж лень писать полностью, тогда
import tkinter as tk
#
root = tk.Tk()
2. Посмотрите, что находится в END.
3. Делать все, что не будет нужно в других методах и не должно быть видно извне класса атрибутами класса не нужно. Это плохо и некрасиво
Да и сами потом запутаетесь.
4. Вот эту всю часть луче убрать в проверку иначе при импорте она также будет выполняться и ценности в ООП как таковом уж точно не будет
if __name__ == "__main__":
root = Tk()
root.iconbitmap('icon.gif')
root.title('Steam key generator')
root.resizable(0, 0)
app = Application(root)
root.mainloop()
5. Откройте для себя форматирование строк. Ведь жутко же…
self.formatted_key = self.key[0:5] + '-' + self.key[
5:10
] + '-' + self.key[10:15]
6. PEP8 на досуге почитать не помешает.
P.S. Вообще для первого раза код хороший. Удачи в освоении.