[Python]第十二章 图形用户界面GUI


GUI就是包含按钮、文本等空间的窗口,Tkinter是事实上的Python标准的GUI工具包,包含在Python标准安装中

12.1创建GUI示例应用程序

CASE编写一个简单的程序可以让用户编辑文本文件
这个微型文本编辑器的需求如下。
 让用户能够打开指定的文本文件。
 让用户能够编辑文本文件。
 让用户能够保存文本文件。
 让用户能够退出
在这里插入图片描述

2.1.1初探

先尝试创建一个顶级主键作为主窗口
在这里插入图片描述
创建一个带按钮的窗口

>>>from tkinter import *#导入模块
>>>top=Tk()#实例化一个Tk对象(最高控件)
>>>btn=Button()#实例化一个Button
>>>btn.pack()#使用管理器pack告诉tkinter将它放在什么地方

>>>def clicked():
       print('I was clicked')
           
>>>btn['command']=clicked#给按钮添加行为
>>>btn['text']='Click me'#给按钮指定一些文本

#进入Tkinter 主事件循环
>>>mainloop()

I was clicked

在这里插入图片描述

改进1:上述赋值可以使用方法config同时设置多个属性
btn.config(text=‘Click me!’, command=clicked)

>>>from tkinter import *#导入模块
>>>top=Tk()#实例化一个Tk对象(最高控件),如果没有这一步,之后创建一个空间也会自己实例化Tk
>>>btn=Button()#实例化一个Button
>>>btn.pack()#使用管理器pack告诉tkinter将它放在什么地方

>>>def clicked():
       print('I was clicked')
           
>>>btn.config(text='Click me!', command=clicked)#给按钮指定一些文本,给按钮添加行为

#进入Tkinter 主事件循环
>>>mainloop()

改进2:上述实例化Button并赋值的语句可以直接用控件的构造函数来配置控件
Button(text=’clicked me to’,command=clicked).pack()

>>>from tkinter import *#导入模块
>>>top=Tk()#实例化一个Tk对象(最高控件)

>>>def clicked():
       print('I was clicked')
           
>>>Button(text=’clicked me to’,command=clicked).pack()#实例化一个Button,使用管理器pack告诉tkinter将它放在什么地方,给按钮指定一些文本,给按钮添加行为

#进入Tkinter 主事件循环
>>>mainloop()

I was clicked

Notice:
可以使用help,dir等查看控件的属性和方法,例如help(Button)可以看到构造是可以传入哪些关键字参数;help(Pack)可以查到.pack()可设置哪些参数
几何管理器Place(位置管理器),Pack(包管理器),Grid(网格管理器)布置这些控件的位置,通过方法place(),pack(),grid()可以被调用。

12.1.2布局

对控件调用方法pack时,将把控件放在其父控件(主控件)中。要指定主控件,可使用构造函数的第一个可选参数;如果没有指定,将把顶级主窗口用作主控件
如下,同样用构造函数配置控件

>>>Label(text='I am the first window').pack()#其中已经自动实例化了一个Tk
>>>second=Toplevel()#Toplevel类表示除主窗口外的另一个顶级窗口
>>>Label(second,text='I am the second window').pack()#这个label设置在second顶级窗口中打开
>>>mainloop()

在这里插入图片描述
没有提供任何参数时,pack从窗口顶部开始将控件堆叠成一列,并让它们在窗口中水平居中。

for i in range(10):
    Button(text=i).pack()
mainloop()    

在这里插入图片描述
布局器pack()设置参数

btn=Button()
btn2=Button()
btn.config(text="hh")
btn2.config(text='fd')
btn.pack(side=LEFT,expand=True)
btn2.pack()
mainloop()

在这里插入图片描述
官方文档

#document
help(Pack.config)
Help on function pack_configure in module tkinter:

pack_configure(self, cnf={}, **kw)
    Pack a widget in the parent widget. Use as options:
    after=widget - pack it after you have packed widget
    anchor=NSEW (or subset) - position widget according to
                              given direction
    before=widget - pack it before you will pack widget
    expand=bool - expand widget if parent size grows
    fill=NONE or X or Y or BOTH - fill widget if widget grows
    in=master - use master to contain this widget
    in_=master - see 'in' option description
    ipadx=amount - add internal padding in x direction
    ipady=amount - add internal padding in y direction
    padx=amount - add padding in x direction
    pady=amount - add padding in y direction
    side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.

三大布局管理器:

  • 网格管理器Grid:将小构件,放在一个不可见网格的每个单元内。可以将小构件放在某个特定的行和列内,也可以使用rowspan和columnspan参数将小构件放在多行和多列中。
  • 包管理器Pack:将小构件依次的一个放置在另一个的顶部或将他们一个挨着一个的放置。
  • 位置管理器Place:将小构件放在绝对位置上。

参考:https://blog.csdn.net/Helloyongwei/article/details/80178266

布局器grid()和place()设置参数

>>> help(Grid.configure) 
>>> help(Place.config) 
12.1.3事件处理

通过设置属性command给按钮指定动作(action)。这是一种特殊的事件处理。
Tkinter还提供了更通用的事件处理机制:方法bind。

>>>from tkinter import *
>>>top=Tk()

>>>def callback(event):
       print(event.x,event.y)#提供了x和y坐标
    
>>>top.bind('<Button-1>',callback)
#'1781005519560callback'
>>>mainloop()
#左鼠标键单击窗口任意位置
112 234#点击位置的横纵坐标

是使用鼠标左按钮(按钮1)单击的事件名称,关联到函数callback
详细参考:>>> help(Tk.bind)

12.1.4最终的程序

还需获悉用于创建小型文本框和大型文本区域的控件的名称。
要创建单行文本框,可使用控件Entry。要提取Entry控件的内容,可使用其方法get。
要创建可滚动的多行文本区域,可结合使用控件Text和Scrollbar,但模块tkinter.scrolledtext已经提供了一种实现。

from tkinter import *
from tkinter.scrolledtext import ScrolledText
def load():
    with open(filename.get()) as file:
        contents.delete('1.0',END)#我们将使用'1.0'来指定第1行的第0个字符(即第一个字符前面),使用END来指定文本末尾,将原来的内容全部删除
        contents.insert(INSERT,file.read())
        
def save():
    with open(filename.get(),'w') as file:#filename.get()提取单行文本框中的内容即文件名
        file.write(contents.get('1.0',END))#将滚动文本框中获取到的内容写入该文件按
        
top=Tk()#实例化一个Tk对象(最高控件)
top.title('Simple Editor')#编辑最高空间按的名称

contents=ScrolledText()#创建一个滚动文本框
contents.pack(side=BOTTOM,expand=True,fill=BOTH)#设置布局

filename=Entry()#创建一个单行文本框
filename.pack(side=LEFT,expand=True,fill=X)#设置布局

#构造函数创建按钮,并关联事件,设置布局
Button(text='open',command=load).pack(side=LEFT)
Button(text='save',command=save).pack(side=LEFT)

mainloop()

输入文件名和文件内容保存文件,关闭窗口后,再次打开,输入文件名才可以显示之前保存的内容,文件实际春促位置在程序当前路径下面。
############
help(ScrolledText.delete)
Help on function delete in module tkinter:

delete(self, index1, index2=None)
Delete the characters between INDEX1 and INDEX2 (not included).

help(ScrolledText.insert)
Help on function insert in module tkinter:

insert(self, index, chars, *args)
Insert CHARS before the characters at INDEX. An additional
tag can be given in ARGS. Additional CHARS and tags can follow in ARGS.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值