2015-04-23 3 views
2

Здравствуйте, я полный новичок в python и сталкиваюсь с проблемой при создании простого gui в tkinter (пытаясь сделать простой понг). В любом случае у меня есть этот код в Python 3:Tkinter gui mainloop "ex ="

from tkinter import Frame 
import tkinter 

class Pong(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.parent.bind("<Key>", self.key) 
     self.initialize() 

    def key(self, event): 
     if event.char == 'q': #end 
      self.quit() 
     print("end") 
    def initialize(self): 
     print("initialize") 
     pass 

def main(): 

    root = tkinter.Tk() 
    ex = Pong(root) 
    root.overrideredirect(True) 
    root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight())) 
    root.mainloop() 

main() 

Я интересно, что конкретно делает дно «ех = Pong (корень)» часть этого, потому что, если я удалю, что программа не работает, я не могу нажать Q, чтобы уйти, но я не могу найти, что это значит, я буквально не могу найти документацию в Интернете.

ответ

1

Pong класс - это оберточная рамка. Он представляет приложение GUI и инкапсулирует (скрывает) материал TKinter GUI.

Рама это «окно» содержание показано в. корень является мастером кадра Тк. root - базовое окно - разрушающий корень уничтожает (закрывает) графический интерфейс.

с этим в виду, я рекомендую попробовать следующие изменения:

class Pong(Frame): 

... 

    def key(self, event): 
     if event.char == 'q': #end 
      # close the base Frame, and our application Frame 
      self.parent.quit() 
      self.quit() 

    # wrapper methods for root control 
    def overrideredirect(bool): 
     self.parent.overrideredirect(bool) 

    def geometry(geo_string): 
     self.parent.geometry(geo_string) 

    def mainloop(): 
     self.parent.mainloop() 

... 

def main(): 

    root = Tkinter.Tk() 
    wdth, hght = root.winfo_screenwidth(), root.winfo_screenheight() 
    ex = Pong(root) 
    ex.overrideredirect(True) 
    ex.geometry("{0}x{1}+0+0".format(wdth, hght)) 
    ex.mainloop() 

Вы можете управлять мастер-окно с помощью Pong. Раньше я использовал этот подход и нашел его более безопасным - я не путался с моим классом Frame и делал неприятные аварии! Также это безопаснее, чем подклассификация Tk.

Также вы можете добавить метод для понга, generate_gui() и запрограммировать его, чтобы настроить виджеты графического интерфейса. это также безопаснее, чем прямое создание виджетов из основной функции.

Проверьте эти в то же время:

http://effbot.org/tkinterbook/

http://www.tkdocs.com/tutorial/

+0

Спасибо! Помогли! – redivider

0
root = tkinter.Tk() 

Это создает виджет верхнего уровня Tk, который обычно является главным окном приложения.

ex = Pong(root) 

Pong это класс, который создает виджет (ex) типа Frame, что имеет определенные характеристики, определенные вами в Pong классе. Для всех виджетов нужен родительский виджет, к которому он может привязываться. Здесь вы создаете дочерний виджет ex типа Pong, связанный с root.

root.overrideredirect(True) 
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight())) 
root.mainloop() 

Здесь вы сообщаете родительскому виджету, какой размер он должен быть и где должно быть его происхождение. (Полный экран и 0,0). Обратите внимание, что вы не указали, какой размер и где находится дочерний виджет ex, который находится внутри root. Вы можете сделать это, используя геометрию tkinter - grids или pack (Больше информации здесь: https://stackoverflow.com/a/26225122/3646530) Так как ex на самом деле не имеет графики, и ваше взаимодействие является только привязкой к ключу, вам не стоит об этом беспокоиться.

Когда вы нажмете, q вы ожидаете, что окно уйдет. Виджет Frame может выйти, но вам также нужен корневой виджет, чтобы уничтожить себя. Так что это работает.

class Pong(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.parent.bind("<Key>", self.key) 
     self.initialize() 

    def key(self, event): 
     if event.char == 'q': #end 
      self.quit() 
     print("end") 


    def quit(self): 
     self.parent.destroy() 

    def initialize(self): 
     print("initialize") 
     pass 

Для получения дополнительной информации о виджетах и ​​функциях Tkinter в попытке здесь: http://effbot.org/tkinterbook/

+0

Хорошо, спасибо большое. Я почти завершил свою первую версию программы – redivider

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