【问题标题】:Tkinter gui mainloop "ex ="Tkinter gui 主循环“ex =”
【发布时间】:2015-04-23 03:25:07
【问题描述】:

您好,我是 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 的含义,我在网上根本找不到文档。

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

    Pong 类是一个包装框架。它代表 GUI 应用程序,并封装(隐藏)Tkinter GUI 的东西。

    Frame 是显示内容的“窗口”。rootTk 主框架。 root 是基本窗口 - 销毁 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 驱动主窗口。我以前使用过这种方法,发现它更安全 - 我没有将 root 与我的 Frame 类混淆并制造严重的事故!它也比继承 Tk 更安全。

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

    同时检查这些:

    http://effbot.org/tkinterbook/

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

    【讨论】:

    • 谢谢!帮了大忙!
    【解决方案2】:
    root = tkinter.Tk()
    

    这会创建一个 Tk 的顶级小部件,它通常是应用程序的主窗口。

    ex = Pong(root)
    

    Pong 是一个创建 Frame 类型的小部件 (ex) 的类,该小部件具有您在 Pong 类中定义的某些特征。所有小部件都需要一个可以绑定到的父小部件。在这里,您正在创建一个绑定到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 (更多信息: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/

    【讨论】:

    • 好的,非常感谢。我几乎完成了我的第一个版本的程序
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2023-01-31
    • 2019-04-16
    相关资源
    最近更新 更多