• Python Tkinter学习(1)——第一个Tkinter程序


    注:本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6885066.html。格式修改未完成。

    Tkinter资料

    Python Wiki, TkInter

    effbot.org, An Introduction to Tkinter

    New Mexico Tech Computer Center, Tkinter 8.5 Reference, a GUI for Python

    还有更多资料,详情请访问第一个Python Wiki链接。

    Tkinter介绍

    Python支持多个图形库,例如Qt、wxWidgets,等等。但是Python的标准GUI库是Tkinter。Tkinter是Tk Interface的缩写。Python提供了tkinter包,里面含有Tkinter接口。

    开始写程序

    要使用Tkinter,首先需要导入Python提供的tkinter模块:

    import tkinter as tk
    

    这个语句导入tkinter模块,但为方便,为它定义了一个别名tk

    GUI系统中,普遍有一个控件(widget)的概念。控件就是指按钮、滚动条、文本框这些东西。特殊地,窗口也是一个控件,窗口可以容纳其它控件。在Tkinter中,用Frame类表示窗口。我们的程序可以直接创建一个Frame对象再向里面添加控件,但习惯上会从Frame类派生出Application类(也可以叫其它名字):

    class Application(tk.Frame):
    

    接下来我们需要为Application编写构造函数__init__

        def __init__(self, master=None):
            tk.Frame.__init__(self, master)
            self.grid()
            self.createWidgets()
    

    首先,__init__有两个参数。第一个是self,即Application对象本身。第二个是master,在Tkinter中,一个控件可能属于另一个控件,这时另一个控件就是这个控件的master。默认一个窗口没有master,因此master有None的默认值。

    第二行tk.Frame.__init__(self, master)调用Application的父类Frame__init__函数初始化Application类的Frame类部分。__init__函数的定义如下:

    __init__(self, master=None, cnf={}, **kw)
    

     

    初始化Frame对象。masterFrame的父控件,默认为Nonecnf尚不清楚;kw为命名关键字参数,可接受的参数将在后面提到。

    因为这里不是直接用对象调用函数,又不是一般意义的创建对象(例如后面的quitButton),而是初始化自身的一部分,因此需要传入self。我们还传入了Application.__init__master参数,作为Frame.__init__的master

    第三行self.grid(),显示窗口并使用grid布局。grid方法是从Frame继承来的。Tkinter中有一个概念叫布局(layout),就是控件的排列方式。除了grid(),还有pack等布局。

    第四行self.createWidgets(),调用后面定义的createWidgets方法。

    然后是createWidgets方法的定义:

        def createWidgets(self):
            self.quitButton = tk.Button(self, text='Quit', command=self.quit)
            self.quitButton.grid()
    

    createWidgets函数的定义就不讲了,只有一个self参数。

    第二行self.quitButton = tk.Button(self, text='Quit', command.self.quit),为Application类创建了一个quitButton属性,类型为Button。Button的构造函数如下:

    __init__(self, master=None, cnf={}, **kw)
    

    初始化Button对象。master为Button的父控件,默认为None;cnf尚不清楚;kw为命名关键字参数,可接受的参数有text(标准)、command(按钮特有),其它参数将在以后提到。

    这里和前面不同,不是初始化自身,而是创建了quitButton属性,因此不需要写Button.__init__(...),而是直接写Button(...),也不需要像前面一样传入self。那为什么还要传入self呢?这个self并不是对应于Button.__init__中的self参数,而是master参数,表示按钮的父控件是窗口!

    我们还传入了text和command两个命名关键字参数。text是显示在按钮上的文字,这里为'Quit';command为点击按钮时调用的函数,这里为Frame类的quit函数,quit函数会使程序退出。

    第三行,self.quitButton.grid(),和前面一样,显示按钮并使用grid()布局。

    然后就轮到创建Application对象了:

    app = Application()
    app.master.title = 'First Tkinter'
    app.mainloop()
    

    第一行app = Application(),创建一个名为app的Application对象。

    第二行app.master.title = 'First Tkinter',将窗口的标题设置为'First Tkinter'。当然可能会因为窗口太小,看不见标题。

    第三行app.mainloop(),进入主循环。

    现在运行你的程序,看看是不是点击Quit按钮就会退出了。当然你也可以通过点击窗口上方的关闭按钮退出。

    主循环

    GUI程序中有一个主循环(main loop)的概念。用伪代码的形式表现出来,是类似于这样的:

    while noQuitCommands:
        checkInput()
        updateWidgets()
        ...
    

    主循环会一直执行,直到出现退出请求。在主循环中,会检查用户输入(例如鼠标、键盘等),并更新控件。这里,如果发现鼠标点击了按钮,就会执行按钮的command,而command是Frame.quit,执行command相当于执行了Frame.quit,循环就结束了,控件全部销毁,程序结束。

    最终代码

    下面是本课的最终代码,配上完整注释:

    # 导入tkinter包,为其定义别名tk
    import tkinter as tk
    
    # 定义Application类表示应用/窗口,继承Frame类
    class Application(tk.Frame):
    	# Application构造函数,master为窗口的父控件
    	def __init__(self, master=None):
    		# 初始化Application的Frame部分
    		tk.Frame.__init__(self, master)
    		# 显示窗口,并使用grid布局
    		self.grid()
    		# 创建控件
    		self.createWidgets()
    
    	# 创建控件
    	def createWidgets(self):
    		# 创建一个文字为'Quit',点击会退出的按钮
    		self.quitButton = tk.Button(self, text='Quit', command=self.quit)
    		# 显示按钮,并使用grid布局
    		self.quitButton.grid()
    
    # 创建一个Application对象app
    app = Application()
    # 设置窗口标题为'First Tkinter'
    app.master.title = 'First Tkinter'
    # 主循环开始
    app.mainloop()
    

     

  • 相关阅读:
    WordPress ProPlayer插件‘id’参数SQL注入漏洞
    WordPress Spider Catalog插件多个SQL注入和跨站脚本漏洞
    Apache Struts2 includeParams属性远程命令执行漏洞(CVE20131966)
    Linux kernel perf_events local root exploit
    Apache Struts ‘ParameterInterceptor’类OGNL安全绕过漏洞
    发现 解决 分享
    契约值多少钱?
    当阳光洒在脸上
    火车上的摘抄
    流浪
  • 原文地址:https://www.cnblogs.com/collectionne/p/6885066.html
Copyright © 2020-2023  润新知