Tkinter gui mainloop "ex ="

Tkinter gui mainloop "ex ="

你好,我是 python 的完全初学者,在 tkinter 中创建简单的 gui 时遇到了问题(试图制作简单的 Pong)。无论如何,我在 python 3:

中有这段代码
    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()

我想知道底部 "ex = Pong(root)" 部分具体是做什么的,因为如果我删除程序不起作用,我不能按 Q 退出,但我找不到 ex 的意思,我真的找不到在线文档。

Pong class 是一个包装框架。它代表 GUI 应用程序,并封装(隐藏)Tkinter GUI 内容。

A Frame是一个"window"里面显示的内容。root是一个Tk 主框架。 root 是基础 window - 销毁 root 会销毁(关闭)GUI。

考虑到这一点,我建议尝试进行以下更改:

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 驱动主机 window。我以前使用过这种方法并发现它更安全 - 我没有将 root 与我的 Frame class 混淆并发生严重事故!而且它比 subclassing Tk.

更安全

您还可以向 pong 添加一个方法,generate_gui(),并对其进行编码以设置您的 GUI 小部件。这也比直接从主函数设置小部件更安全。

同时看看这些:

http://effbot.org/tkinterbook/

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

root = tkinter.Tk()

这将创建 Tk 的顶级小部件,通常是应用程序的主要 window。

ex = Pong(root)

Pong 是一个 class,它创建一个 Frame 类型的小部件 (ex),它具有您在 Pong [=38= 中定义的特定特征].所有小部件都需要一个可以绑定到的父小部件。在这里,您正在创建绑定到 rootPong 类型的子窗口小部件 ex

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

在这里您要告诉父窗口小部件它应该是什么大小以及它的起点应该在哪里。 (全屏和 0,0)。请注意,您没有提到子部件 ex 需要在 root 内的大小和位置。您可以使用 tkinter 的几何图形 - gridspack(此处有更多信息:)因为 ex 实际上没有任何图形,您的交互只是键绑定,你还不用担心。

当您按下时,q 您希望 window 退出。 Frame 小部件可能会退出,但您还需要 root 小部件自行销毁。所以像这样的东西是有效的。

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/