Python学习笔记-第6天:初涉GUI编程

第六天 初涉GUI编程

在web编程的主流时代,GUI用的确实不多。学习这一块的目的计划承上启下,巩固下面向对象编程。学习项目及练习源码地址:
GitHub源码

关于Pytgon GUI

在昨天的学习内容里面有提及常用的几个GUI框架。

图形用户界面是由一个个组件组成,就像小孩“搭积木”一样最终组成了整个界面。有的组件还能在里面再放置其他组件,我们称为“容器”。

Tkinter编写一个GUI程序

一般步骤:

  • 创建应用程序主窗口对象(也称:根窗口)

  • 在主窗口中,添加各种可视化组件,比如:按钮(Button)、文本框(Label)等

  • 通过几何布局管理器,管理组件的大小和位置

  • 事件处理

    在组件上绑定各种用户事件。如:按钮点击

    from tkinter import * # 最好不要这样导入所有
    from tkinter import messagebox # 为什么要这样导入一次,前面已经有*了?
    
    def btn_click(e):
        messagebox.showinfo("Message","按钮点击!")
        print("点击了按钮")
    
    root = Tk(screenName="Hello World")
    root.title("GUI开发练习") # 设置标题
    root.geometry("500x400+100+200") # 设置画布大小
    btn001 = Button(root)
    btn001['text'] = "按钮一"
    btn001.bind("<Button-1>",btn_click) 
    
    btn001.pack() # 将按钮放在画布上
    
    root.mainloop() # 不这样窗口打开后自动关闭
    

Tkinter常用类介绍

Misc和Wm:

Tkinter的GUI组件有两个根父类,它们都直接继承了object类:

  1. Misc:它是所有组件的根父类。
  2. Wm:它主要提供了一些与窗口管理器通信的功能函数。

Tk

Misc和Wm派生出子类Tk,它代表应用程序的主窗口。一般应用程序都需要直接或间
接使用Tk。

Pack、Place、Grid

Pack、Place、Grid 是布局管理器。布局管理器管理组件的:大小、位置。通过布局管 理器可以将容器中的组件实现合理的排布。

BaseWidget

BaseWidget 是所有组件的父类

Widget

Widget是所有组件类的父类。Widget一共有四个父类:BaseWidget、Pack、Grid、
Place。意味着,所有GUI组件同时具备这四个父类的属性和方法。

GUI应用程序类的经典写法

使用面向对象的方式,可以更加合理的组织GUI应用程序的代码。
通过一个App类组织整个GUI程序,类App继承了Frame(一个容器组件)及通过继承拥有了父类的特性。通过构造函数 __init__()初始化窗口中的对象,通过createWidgets()方法创建窗口中的对象。示例代码

Label标签组件

Label(标签)主要用于显示文本信息,也可以显示图像。
如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。

Options选项

可以通过Options设置组件的属性,从而控制组件的各种状态。比如:宽度、高度、颜色、位置等等。
我们可以通过三种方式设置Options选项,这在各种GUI组件中用法都一致。

  • 创建对象时,使用可变参数

    btn = Button(self, fg="red", bg="blue")

  • 创建对象后,使用字典索引方式

    btn = Button(self)
    btn['fg'] = "red"
    btn['bg'] = "blue"
    
  • 创建对象后,使用 config()方法

    btn = Button(self)
    btn.config(fg="red", bg="blue")
    

常见组件属性一览

选项名(别名) 含义
activebackground 指定组件处于激活状态时的背景色
activeforeground 指定组件处于激活状态时的前景色
anchor 指定组件内的信息(比如文本或图片)在组件中如何显示(当所在组件比信息大时,可以看出效果)。必须为下面的值之一:N、NE、E、SE、S、SW W、NW 或 CENTER。比如 NW(NorthWest)指定将信息显示在组件的左上角
background(bg) 指定组件正常显示时的背景色
bitmap 指定在组件上显示该选项指定的位图,该选项值可以是Tk_GetBitmap接收的任何形式的位图。位图的显示方式受anchor、justify选项的影响。如果同时指定了bitmap和text,那么 bitmap 覆盖文本;如果同时指定了bitmap和image,那么image覆bitmap
borderwidth 指定组件正常显示时的 3D 边框的宽度,该值可以是 Tk_GetPixels 接收的任 何格式
cursor 指定光标在组件上的样式。该值可以是 Tk_GetCursors 接受的任何格式
command 指定按组件关联的命令方法,该方法通常在鼠标离开组件时被触发调用
disabledforeground 指定组件处于禁用状态时的前景色
font 指定组件上显示的文本字体
foreground(fg) 指定组件正常显示时的前景色
highlightbackground 指定组件在高亮状态下的背景色
highlightcolor 指定组件在高亮状态下的前景色
highlightthickness 指定组件在高亮状态下的周围方形区域的宽度,该值可以是 Tk_GetPixels 接收的任何格式
height 指定组件的高度,以 font 选项指定的字体的字符高度为单位,至少为 1
image 指定组件中显示的图像,如果设置了 image 选项,它将会覆盖 text、bitmap 选项
justify 指定组件内部内容的对齐方式,该选项支持 LEFT(左对齐)、CENTER(居 中对齐)或 RIGHT(右对齐)这三个值
padx 指定组件内部在水平方向上两边的空白,该值可以是 Tk_GctPixels接收的任何格式
pady 指定组件内部在垂直方向上两地的空白,该值可以是 Tk_GctPixels接收的任何格式指定组件的 3D 效果,该选项支持的值包括 RAISED、SUNKEN、FLAT、 relief RIDGE、SOLID、GROOVE。该值指出组件内部相对于外部的外观样式,比如 RAISED 表示组件内部相对于外部凸起
selectbackground 指定组件在选中状态下的背景色
selectborderwidth 指定组件在选中状态下的3D边框的宽度,该值可以是Tk_GetPixels接收的任何格式
selectforeground 指定组在选中状态下的前景色
state 指定组件的当前状态。该选项支持 NORMAL(正常)、DISABLE(禁用) 这两个值
takefocus 指定组件在键盘遍历(Tab 或 Shift+Tab)时是否接收焦点,将该选项设为 1 表示接收焦点;设为 0 表示不接收焦点
text 指定组件上显示的文本,文本显示格式由组件本身、anchor 及 justify 选 项决定
textvariable 指定一个变量名,GUI 组件负责显示该变量值转换得到的字符串,文本显 示格式由组件本身、anchor 及 justify 选项决定
underline 指定为组件文本的第几个字符添加下画线,该选项就相当于为组件绑定了 快捷键
width 指定组件的宽度,以 font 选项指定的字体的字符高度为单位,至少为 1
wraplength 对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过该

Button组件

Button(按钮)用来执行用户的单击操作。Button可以包含文本,也可以包含图像。按钮被单击后会自动调用对应事件绑定的方法。

Entry单行文本框

Entry用来接收一行字符串的控件。如果用户输入的文字长度长于Entry控件的宽度时, 文字会自动向后滚动

Text多行文本框

Text(多行文本框)的主要用于显示多行文本,还可以显示网页链接, 图片, HTML页面, 甚至 CSS 样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者 网页浏览器来使用。

Radiobutton单选按钮

Checkbutton复选按钮

canvas画布

canvas(画布)是一个矩形区域,可以放置图形、图像、 组件等。

布局管理器

tkinter提供的布局管理器帮助组织、管理在父组件中子组件的布局方式。tkinter提供了三种管理器:pack、grid、place。

grid布局管理器

grid表格布局,采用表格结构组织组件。子组件的位置由
行和列的单元格来确定,并且可以跨行和跨列,从而实现复
杂的布局

pack布局管理器

pack按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。

place 布局管理器

place 布局管理器可以通过坐标精确控制组件的位置,适用
于一些布局更加灵活的场景

事件处理

一个GUI应用整个生命周期都处在一个消息循环 (event
loop) 中。它等待事件的发生,并作出相应的处理。
Tkinter提供了用以处理相关事件的机制. 处理函数可被绑 定给各个控件的各种事件。
widget.bind(event, handler)
如果相关事件发生, handler函数会被触发, 事件对象
event会传递给handler函数.

组件对象的绑定

  1. 通过command属性绑定(适合简单不需获取event对象)

    Button(root,text=”登录”,command=login)

  2. 通过 bind()方法绑定(适合需要获取 event 对象)

    c1 = Canvas(); 
    c1.bind(“<Button-1>”,drawLine)
    

组件类的绑定

调用对象的bind_class函数,将该组件类所有的组件绑定事件:

w.bind_class(“Widget”,”event”,eventhanler)

菜单和工具栏

主菜单

主菜单一般包含:文件、编辑、帮助等,位于GUI窗口的上面。创建主菜单一般有如下4步:

  1. 创建主菜单栏对象

    menubar = tk.Menu(root)

  2. 创建菜单,并添加到主菜单栏对象

     file_menu = tk.Menu(menubar)
     menubar.add_cascade(label=”文件”,menu=file_menu) 
    
  3. 添加菜单项到 2 步中的菜单

    file_menu.add_command(label=”打开”)
    file_menu.add_command(label=”保 存”,accelerator=”^p command=mySaveFile)
    file_menu.add_separator()
    file_menu.add_command(label=”退出”) 
    
  4. 将主菜单栏添加到根窗口

    root[“menu”]=menubar

上下文菜单

快捷菜单(上下文菜单)是通过鼠标右键单击组件而弹出的菜单,一般是和这个组件相关的操作,比如:剪切、复制、粘贴、属性等。

  1. 创建菜单

    menubar = tk.Menu(root) 
    menubar.add_command(label=”字体”)
    
  2. 绑定鼠标右键单击事件

    def test(event):
        menubar.post(event.x_root,event.y_root) #在鼠标右键单击坐标处显示菜单
    root.bind(“<Button-3>”,test) # 在窗体绑定事件
    

其他组件

OptionMenu选择项

OptionMenu(选择项)用来做多选一,选中的项会在顶部显
示。

Scale移动滑块

Scale(移动滑块)用于在指定的数值区间,通过滑块的移动来选择值

颜色选择框

颜色选择框可以用来设置背景色、前景色、画笔颜色、字体颜色等等。

文件对话框

文件对话框帮助我们实现可视化的操作目录、操作文件。最后,将文件、目录的信息传入到程序中。

简单输入对话框

simpledialog(简单对话框)

通用消息框

messagebox(通用消息框)用于和用户简单的交互,用户点击确定、取消。

项目实战练习

编写一个记事本程序

需求分析

模仿windows的记事本,实现新建、保存等功能。

  • 需要一个主菜单
  • 需要一个右键菜单
  • 最好能响应快捷

详细设计

练习代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335