Python图形化用户界面入门实例-tkinter

写在前面

其实上一篇文章的小项目本来是服务于本文中这个gui中的一个功能,但考虑到是一个单独的知识点于是单列出来进行了讲解,因此本文就讲述这个gui实例的主体部分是如何实现的。

本文代码均属原创,如有雷同纯属巧合,转载也请注明出处。
作者学习尚浅,该项目更多为作者学习记录,如对初学者有所帮助倍感荣幸,如有大佬对内容做出批评指正不胜感激。

声明:本文档仅用于学习与交流使用,严禁用于一切商业用途,由此产生的后果本人概不负责。

成果展示

在本部分将主要将学习与实践的成果进行展示,包括代码以及最终实现样例。

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)

代码实现结果

窗口主体:
在这里插入图片描述
点击‘更新’之后:
在这里插入图片描述

点击‘历史’之后(历史数据均为之前数据采集样例的备份,并非当前最新数据,图形显示也是如此):
在这里插入图片描述
点击‘图像’之后:
在这里插入图片描述

至此本篇分享就算是完成啦,希望作为本人学习路上记录的一些点滴,能够为后来之人提供一些捷径。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值