基本概念
GUI - Graphical User Interface. 中文叫图形用户接口。图像用户接口可以看做为人与计算机之间的沟通媒介。
如果想为自己写的程序做一个易于操作的界面,那么,tkinter应该是最容易上手的图形接口开发工具。
tkinter 是python自带的模块,在安装python的同时,tkinter模块就已经在系统里了。只需import导入,即可使用。tkinter模块并没有网上说的那么差,只是官方编写的tkinter的文档很差劲。之后的一段时间,我会将tkinter模块的使用做一个详细的介绍。
导入tkinter模块
from tkinter import * 或者是 import tkinter as tk
这是两种最常见的导入写法。
from X import * 和 import X 的区别
在导入python 模块的时候,很多时候我们都面临上述两种导入的选择。下面我将说明这两种方法的区别。
import X
import X 意味着创建了一个模块 X的引用。假设模块X里有一个函数方法 func(),如果想调用func,就需要使用完整的路径,例如 X.func();
from X import *
from X import * 意味着对模块X里的所有对象创建了引用。此时,如果想调用func,只需要使用func()即可。同时,由于你并没有创建X的引用,你将无法通过X.func()调用func方法。
举个例子,模块X相当于姓氏,模块X里的对象相当于名。如果一个班两个 ’天天‘,一个叫陶天天,一个叫欧天天。那么,老师就需要加上姓去区分两个’天天‘。但是,如果班里只有一个孩子叫’天天‘,就只需要喊’天天‘就好。
导入tkinter模块之后,可以使用TkVersion去查看tkinter模块的版本。
import tkinter as tkprint(tk.TkVersion)Out[2]: 8.6
创建窗口
tkinter中的Tk() 方法可以创建一个根窗口,之后添加的控件将会被放进这个创建的窗口里。
import tkinter as tkwindow = tk.Tk()window.mainloop()
![47030041e6be7bc2690687871618da09.png](https://i-blog.csdnimg.cn/blog_migrate/4954e357b11a2279e465c4b77af47484.jpeg)
创建的窗口,取名window
window.mainloop() 会启动创建的window GUI。
窗口建立好,就需要进行一些相关的设置。比如窗口标题,图标,大小,底色等等。
添加图标
默认的图标是一片树叶,如上图左上角。自己建的窗口,自然想换上漂亮、大气的图标。tkinter提供了iconbitmap 方法来更换图标。如果想使用下图作为图标,我们只需要如下设置。
![208e0ec7263a72fecf468d925f06d4aa.png](https://i-blog.csdnimg.cn/blog_migrate/6e39e04b034fae1872ce615a8586fe9f.jpeg)
图标
import tkinter as tkwindow = tk.Tk()window.iconbitmap('palm-tree-icon.ico')window.mainloop()
'palm-tree-icon.ico' 是图标存储的路径,如果图标在程序所在的文件夹里,可以直接调用。不然就得使用完整的路径。
![6d7923c4407242d6a55a2d6b90190e8d.png](https://i-blog.csdnimg.cn/blog_migrate/9cd8857811d0a91f1506f03316c0b6be.jpeg)
图标更改后的窗口
设置标题
默认的窗口标题是左上角的tk,通过title()可以设置窗口的标题。
import tkinter as tkwindow = tk.Tk()window.title('逃学联盟')window.iconbitmap('palm-tree-icon.ico')window.mainloop()
![a513737983ff78a5af961e19be675952.png](https://i-blog.csdnimg.cn/blog_migrate/91ec204d5a62d3c3e72813714f4b7162.jpeg)
标题更改后的窗口
设置背景颜色
使用configure()设置背景颜色,window.configure(bg='#008CBA')
import tkinter as tkwindow = tk.Tk()window.title('逃学联盟')window.configure(bg='#008CBA')window.iconbitmap('palm-tree-icon.ico')window.mainloop()
![04fd3de39ce034b48cbc0e468d13b9c3.png](https://i-blog.csdnimg.cn/blog_migrate/e694b199ed2399aac91ece1dafbcd6ec.jpeg)
背景色设置后的窗口
设置窗口大小和屏幕的相对位置
geometry()可以用来设置初始窗口的大小以及窗口于屏幕的相对位置。注意,代码中的x不是乘法,是字母xy的x。具体方法如下:
.geometry("窗口宽 x 窗口高 + 屏幕左边框相对距离 + 屏幕上边框相对距离")。
import tkinter as tkwindow = tk.Tk()window.title('逃学联盟')window.configure(bg='#008CBA')window.geometry("500x100+300+300")window.iconbitmap('palm-tree-icon.ico')window.mainloop()
上述代码创建了一个500 * 100 px大小的窗口,窗口左上角坐标是(300,300)。
![f690f5c618cec62737fe958fb3c7c1bc.png](https://i-blog.csdnimg.cn/blog_migrate/e3b98c80547ed8e9d0a85c4c78a7b8ef.jpeg)
图片来源网络
如果需要将窗口放在屏幕的正中,可以通过一些简单的计算和geometry()方法。
通过.winfo_screenwidth() 和 .winfo_screenheight() 方法可以得到屏幕的宽和高。如果我们需要将窗口放在屏幕正中,窗口的左边框距离屏幕的左边框为 (屏幕宽 - 窗口宽)/ 2。
import tkinter as tkwindow = tk.Tk()window.title('逃学联盟')window.configure(bg='#008CBA')window_width = 500window_height = 100screen_width = window.winfo_screenwidth()screen_height = window.winfo_screenheight()x = int((screen_width - window_width)/2)y = int((screen_height - window_height)/2)window.geometry(f"{window_width}x{window_height}+{x}+{y}")window.iconbitmap('palm-tree-icon.ico')window.mainloop()
设置窗口的最小的宽高,最大的宽高,全屏显示和窗口是否可以拖拽大小
.resizable(True, True)方法设置窗口的宽和长是否可以拖拽调整大小;
.minsize(宽, 高)方法设置窗口的最小宽高;
.maxsize(宽, 高)方法设置窗口的最大宽高;
.state('zoomed')方法设置窗口全屏显示
.maxsize(宽, 高)方法 和 .state('zoomed')方法不要同时使用。
import tkinter as tkwindow = tk.Tk()window.title('逃学联盟')window.configure(bg='#008CBA')window.resizable(True, True)window.minsize(100, 100)# window.maxsize(1000, 500)window.state('zoomed')window_width = 500window_height = 100screen_width = window.winfo_screenwidth()screen_height = window.winfo_screenheight()x = int((screen_width - window_width)/2)y = int((screen_height - window_height)/2)window.geometry(f"{window_width}x{window_height}+{x}+{y}")window.iconbitmap('palm-tree-icon.ico')window.mainloop()
实例1
鉴于还没有开始其他的tkinter组件,第一个实例借助after方法实现窗口背景色的更换还有窗口的关闭。
after(delay_ms, callback=None, *args)
after()方法会每隔delay_ms (毫秒)调用callback的函数。
window.destroy()方法会关闭window窗口。
import tkinter as tkimport randomwindow = tk.Tk()window.title('逃学联盟')window.configure(bg='#008CBA')window.resizable(True, True)window.minsize(100, 100)# window.maxsize(1000, 500)window.state('zoomed')window_width = 500window_height = 100screen_width = window.winfo_screenwidth()screen_height = window.winfo_screenheight()x = int((screen_width - window_width)/2)y = int((screen_height - window_height)/2)window.geometry(f"{window_width}x{window_height}+{x}+{y}")window.iconbitmap('palm-tree-icon.ico')bg_color_list = ['#008CBA', '#FFA500', '#4CAF50', '#f44336']def adjust_bg_color(): if bg_color_list: rand = random.choice(bg_color_list) window.configure(bg=rand) window.after(2000, adjust_bg_color) bg_color_list.remove(rand) else: window.destroy()window.after(0, adjust_bg_color)window.mainloop()
- 定义一个列表 bg_color_list 含有四种不同的颜色代号;
- 定义callback函数 adjust_bg_color, 如果adjust_bg_color里有值,则随机挑选一个颜色,并更改窗口的bg属性;
- 每隔2000毫秒调用一次adjust_bg_color;
- 列表 bg_color_list 中移除被选中的颜色代号;
- 如果列表 bg_color_list 为空,则关闭窗口;
感兴趣的同学可以自行运行例子,后面会逐一介绍tkinter的组件。谢谢大家!