Python图形化用户界面入门实例-tkinter
写在前面
其实上一篇文章的小项目本来是服务于本文中这个gui中的一个功能,但考虑到是一个单独的知识点于是单列出来进行了讲解,因此本文就讲述这个gui实例的主体部分是如何实现的。
- 上篇文章:Python图形化数据入门实例-基于Matplotlib
- 系统版本:Windows10 64
- Python版本: 3.7
- 调用库: tkinter
该为内部库,一般无需另行下载
本文代码均属原创,如有雷同纯属巧合,转载也请注明出处。
作者学习尚浅,该项目更多为作者学习记录,如对初学者有所帮助倍感荣幸,如有大佬对内容做出批评指正不胜感激。
声明:本文档仅用于学习与交流使用,严禁用于一切商业用途,由此产生的后果本人概不负责。
成果展示
在本部分将主要将学习与实践的成果进行展示,包括代码以及最终实现样例。
tkinter库介绍
在tkinter库的教程中,给出了一个试例程序,A Simple Hello World Program。
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
self.hi_there = tk.Button(self)
self.hi_there["text"] = "Hello World\n(click me)"
self.hi_there["command"] = self.say_hi
self.hi_there.pack(side="top")
self.quit = tk.Button(self, text="QUIT", fg="red",
command=self.master.destroy)
self.quit.pack(side="bottom")
def say_hi(self):
print("hi there, everyone!")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
代码实现结果:
点击Hello World之后:
该示例程序给出了我们很多信息,关于如何创建一个窗口图形化用户界面。首先我们需要创建一个框架类Frame
对象,在框架类对象中部署各种你需要在窗口中展示的控件,以及你可能需要执行的操作,而在框架之外,你需要新建一个Tk类Tk
对象根窗口,用于承载你所创建的框架,以及在窗口中对框架进行实时刷新app.mainloop()
以保证程序能够正常执行。
引入
首先引入必要的库以及模块,包括tkinter
库,spider
模块,datashow
模块等。
import tkinter as tk
import spider
from spider import SpiderTraffic as sp
from dataShow import DataShow as ds
SpeedShow类
该类为当前车速显示框架类,包括区域名显示,当前数据显示等信息,继承于tk.Frame类。
类初始化
类初始化函数,带入上述参数,代码如下:
#初始化类,继承父类初始化函数,并引入其根窗口
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.create_widgets()
添加控件
通过建立create_widgets()
方法来添加一些我们所需的控件,同时我们在这里运行了类的speed_fgrid()
方法,用于显示区域名和各个区域的车速数据,具体代码如下:
#添加小部件,包括区域名和‘当前那车速情况’标签
def create_widgets(self):
self.speed_label = tk.Label(self, text='当前车速情况(km/h):')
self.speed_label.grid(row=2, column=1)
self.areas = ['中心', '越秀', '荔湾', '天河', '海珠', '白云']
self.speed_grid() #区域名和当前车速数据的表格显示函数
数据显示
在本方法中需要将区域名以及各个区域的当前车速数据进行显示,就需要两个步骤,1是数据获取,2是数据显示:数据获取利用了引入的spider
模块中的SpiderTraffic
类中的speedDataGet()
方法进行获取;数据显示则是使用tkinter
库中自带的表格式显示方法,循环进行显示,具体代码如下:
#新建函数进行区域名和当前车速数据的表格显示
def speed_grid(self):
spt = sp(spider.url, spider.headers, spider.proxies)
speed_var = sp.speedDataGet(spt) #利用sp类中的当前速度获取函数并保存
for i in range(len(self.areas)): #表格排列显示区域和当前车速
tk.Label(self, text=self.areas[i]).grid(row=1, column=i+2, padx=10)
tk.Label(self, text=speed_var[i]).grid(row=2, column=i+2, padx=10)
Buttons类
该类为按钮框架类,包括实现各种功能的按钮,继承于tk.Frame类,并传入一个SpeedShow类对象。
类初始化
#初始化类,继承父类初始化函数,并引入其根框架
def __init__(self, master=None, speed_show=None):
super().__init__(master)
self.master = master
self.create_widgets()
self.speed_show = speed_show
添加控件
与上述类似,不做重复,详见代码:
#添加小部件,包括‘刷新’‘历史’‘图像’‘退出’四个按钮
def create_widgets(self):
self.refresh = tk.Button(self, text='更新', command=self.data_refresh)
self.refresh.grid(row=1, column=1, padx=10, pady=10, ipadx=10, ipady=10)
self.history = tk.Button(self, text='历史', command=self.data_history)
self.history.grid(row=1, column=2, padx=10, pady=10, ipadx=10, ipady=10)
self.graphic = tk.Button(self, text='图像', command=self.data_graphic)
self.graphic.grid(row=1, column=3, padx=10, pady=10, ipadx=10, ipady=10)
self.quit = tk.Button(self, text='退出', command=self.master.destroy) #退出按钮功能继承自父类
self.quit.grid(row=1, column=4, padx=10, pady=10, ipadx=10, ipady=10)
刷新函数
刷新数据函数,由于该窗口执行一次获取数据并显示的方法之后不会自动刷新,且实时刷新消耗过大,因此考虑手动刷新(当然可以进行自动刷新,通过设置定时函数完成,具体参见第一篇文章)。具体代码如下:
#刷新数据
def data_refresh(self):
print('data_refresh')
self.speed_show.speed_grid() #重新执行SpeedShow类对象的speed_grid()方法
显示历史
建立一个用于显示历史数据的函数,用于用户按下histroy
按钮时显示历史获取到的数据,具体代码如下:
#显示历史数据
def data_history(self):
print('data_history')
windows = tk.Toplevel(self.master) #创建一个新的窗口
windows.title('历史记录')
windows.geometry('450x200')
with open('data.csv', 'r') as f:
lines = f.readlines()
for line in lines:
tk.Label(windows, text=line).pack(side='top')
显示图像
调用DataShow
类中的graphicShow()
方法进行数据图形化显示,具体代码如下:
#显示图形化数据
def data_graphic(self):
print('data_graphic')
data_graphic = ds() #新建一个DataShow类对象
data_graphic.graphicShow() #执行DataShow类对象的graphicShow()方法
Root类
根框架类,用于承载之前部署的各个子框架,继承于tk.Tk
类。
类初始化
#初始化类,继承父类初始化函数
def __init__(self):
super().__init__()
self.title('广州交通车速查询系统')
self.geometry('450x200')
self.add_frames()
添加子框架
在根框架中添加之前设定好的各个子框架,注意需要先实例化类对象,具体代码如下:
#添加各个子框架
def add_frames(self):
self.welcome = tk.Label(self, text='欢迎来到广州交通车速查询系统')
self.welcome.grid(row=1, column=1, pady=10)
self.speed_show = SpeedShow(master=self)
self.speed_show.grid(row=2, column=1, pady=10)
self.buttons = Buttons(master=self, speed_show=self.speed_show)
self.buttons.grid(row=3, column=1, pady=10)
代码实现结果
窗口主体:
点击‘更新’之后:
点击‘历史’之后(历史数据均为之前数据采集样例的备份,并非当前最新数据,图形显示也是如此):
点击‘图像’之后:
至此本篇分享就算是完成啦,希望作为本人学习路上记录的一些点滴,能够为后来之人提供一些捷径。