Python GUI开发之Tkinter应用篇1:设计串口工具GUI界面

在这里插入图片描述

一、前言

本节我们综合一下前面学习过的组件,来制作一个串口工具的GUI界面,以此展开我们的Tkinter应用篇~

二、创建标题和菜单栏

title可以创建标题,Menu组件可以创建一个多级菜单

from tkinter import *
root = Tk()
root.title("串口调试助手")
def MenuCallback1():
    print("另存为")

def MenuCallback2():
    print("关闭")

def MenuCallback3():
    print("截图")
menubar = Menu(root)  #创建一个顶级菜单
filemenu = Menu(menubar,tearoff = False) #创建一个子菜单filemenu,长在顶级菜单menubar下
menubar.add_cascade(label = "文件",menu = filemenu) #为子菜单filemenu取个名字,长在顶级菜单menubar下
filemenu.add_command(label = "另存为",command = MenuCallback1) #为子菜单filemenu添加选项,取名"另存为"
filemenu.add_command(label = "关闭",command = MenuCallback2)  #为子菜单filemenu添加选项,取名"关闭"

#同样的下面再在顶级菜单下创建一个"工具"
toolmenu = Menu(menubar,tearoff = False)
menubar.add_cascade(label = "工具",menu = toolmenu)
toolmenu.add_command(label = "截图",command = MenuCallback3)

root.config(menu = menubar)
mainloop()

三、串口参数设置部分

使用Label、Combobox、LabelFrame组件来实现

from tkinter import *
from tkinter import ttk  #导入ttk模块,因为Combobox下拉菜单控件在ttk中
root = Tk()
root.title("串口调试助手")

group_serial_set = LabelFrame(root,text = "串口设置")
group_serial_set.grid(row = 0,column = 1)
serial_label = Label(group_serial_set,text = "串口号")
serial_label.grid(row = 1,column = 1,sticky = W)
serial_combobox = ttk.Combobox(group_serial_set,width = 8)
serial_combobox['value'] = ("COM0","COM1","COM2","COM3")
serial_combobox.grid(row = 1,column = 2)

bound_label = Label(group_serial_set,text = "波特率")
bound_label.grid(row = 2,column = 1)
bound_combobox = ttk.Combobox(group_serial_set,width = 8)
bound_combobox['value'] = ("9600","19200","115200","921600")
bound_combobox.grid(row = 2,column = 2)

databits_label = Label(group_serial_set,text = "数据位")
databits_label.grid(row = 3,column = 1)
databits_combobox = ttk.Combobox(group_serial_set,width = 8)
databits_combobox['value'] = ("1","1.5","2")
databits_combobox.grid(row = 3,column = 2)

checkbits_label = Label(group_serial_set,text = "校验位")
checkbits_label.grid(row = 4,column = 1)
checkbits_combobox = ttk.Combobox(group_serial_set,width = 8)
checkbits_combobox['value'] = ("奇校验","偶校验","无校验")
checkbits_combobox.grid(row = 4,column = 2)

mainloop()

四、接收参数设置部分

使用Label、Radiobutton、Checkbutton、LabelFrame组件来实现

from tkinter import *
from tkinter import ttk  #导入ttk模块,因为Combobox下拉菜单控件在ttk中
root = Tk()
root.title("串口调试助手")

recv_set_v = IntVar()
recv_set = LabelFrame(root,text = "接收设置")
recv_set.grid(row = 1,column = 1)
recv_set_radiobutton1 = Radiobutton(recv_set,text = "ASCII",variable = recv_set_v,value = 1)
recv_set_radiobutton1.grid(row = 6,column = 1,sticky = W)
recv_set_radiobutton2 = Radiobutton(recv_set,text = "HEX",variable = recv_set_v,value = 2)
recv_set_radiobutton2.grid(row = 6,column = 2,sticky = W)

recv_set_v2 = IntVar()
recv_set_v3 = IntVar()
recv_set_v4 = IntVar()
recv_set_checkbutton1 = Checkbutton(recv_set,text = "自动换行",variable = recv_set_v2)
recv_set_checkbutton1.grid(row = 7,column = 1)
recv_set_checkbutton2 = Checkbutton(recv_set,text = "显示发送",variable = recv_set_v3)
recv_set_checkbutton2.grid(row = 8,column = 1)
recv_set_checkbutton3 = Checkbutton(recv_set,text = "显示时间",variable = recv_set_v4)
recv_set_checkbutton3.grid(row = 9,column = 1)

mainloop()

五、发送参数设置部分

这部分和接收设置类似,但多了一个Spinbox组件,用来设置发送时间间隔

from tkinter import *
from tkinter import ttk  #导入ttk模块,因为Combobox下拉菜单控件在ttk中
root = Tk()
root.title("串口调试助手")

def RecvTimeCallback():
    print(send_set_v7.get())
    
send_set_v5 = IntVar()
send_set_v6 = IntVar()
send_set_v7 = IntVar()
send_set = LabelFrame(root,text = "发送设置")
send_set.grid(row = 2,column = 1)
send_set_radiobutton3 = Radiobutton(send_set,text = "ASCII",variable = send_set_v5,value = 3)
send_set_radiobutton3.grid(row = 11,column = 1,sticky = W)
send_set_radiobutton4 = Radiobutton(send_set,text = "HEX",variable = send_set_v5,value = 4)
send_set_radiobutton4.grid(row = 11,column = 2)
send_set_checkbutton4 = Checkbutton(send_set,text = "重复发送",variable = send_set_v6)
send_set_checkbutton4.grid(row = 12,column = 1)
Label(send_set,text = "时间间隔:").grid(row = 13,column = 1,sticky = W)
Spinbox(send_set,from_ = 0,to = 9999,textvariable = send_set_v7,command = RecvTimeCallback,width = 6).grid(row = 13,column = 2,sticky = W)

mainloop()

六、设置发送区和接收区

我们创建两个Frame,分别用以发送区和接收区,并在发送区中设置一个“发送”按钮,用以将我们的消息通过串口发送出去。

from tkinter import *
from tkinter import ttk  #导入ttk模块,因为Combobox下拉菜单控件在ttk中
root = Tk()
root.title("串口调试助手")

def SendCallback():
    print("发送")
    
framRCV = Frame(root,width = 500,height = 250)
framRCV.grid(row = 0,column = 2,rowspan = 2)
Text(framRCV,width = 60,height = 17,pady = 10).grid(row = 0,column = 1)
framSEND = Frame(root,width = 500,height = 80)
framSEND.grid(row = 2,column = 2)
Text(framSEND,width = 50,height = 5,pady = 10).grid(row = 0,column = 1)
Button(framSEND,text = "发送",padx = 20,command = SendCallback).grid(row = 0,column = 2)

mainloop()

七、完整代码

from tkinter import *
from tkinter import ttk  #导入ttk模块,因为Combobox下拉菜单控件在ttk中
root = Tk()
root.title("串口调试助手")
#root.geometry("800x600")
def MenuCallback1():
    print("另存为")

def MenuCallback2():
    print("关闭")

def MenuCallback3():
    print("截图")
menubar = Menu(root)  #创建一个顶级菜单
filemenu = Menu(menubar,tearoff = False) #创建一个子菜单filemenu,长在顶级菜单menubar下
menubar.add_cascade(label = "文件",menu = filemenu) #为子菜单filemenu取个名字,长在顶级菜单menubar下
filemenu.add_command(label = "另存为",command = MenuCallback1) #为子菜单filemenu添加选项,取名"另存为"
filemenu.add_command(label = "关闭",command = MenuCallback2)  #为子菜单filemenu添加选项,取名"关闭"

#同样的下面再在顶级菜单下创建一个"工具"
toolmenu = Menu(menubar,tearoff = False)
menubar.add_cascade(label = "工具",menu = toolmenu)
toolmenu.add_command(label = "截图",command = MenuCallback3)


root.config(menu = menubar)

group_serial_set = LabelFrame(root,text = "串口设置")
group_serial_set.grid(row = 0,column = 1)
serial_label = Label(group_serial_set,text = "串口号")
serial_label.grid(row = 1,column = 1,sticky = W)
serial_combobox = ttk.Combobox(group_serial_set,width = 8)
serial_combobox['value'] = ("COM0","COM1","COM2","COM3")
serial_combobox.grid(row = 1,column = 2)

bound_label = Label(group_serial_set,text = "波特率")
bound_label.grid(row = 2,column = 1)
bound_combobox = ttk.Combobox(group_serial_set,width = 8)
bound_combobox['value'] = ("9600","19200","115200","921600")
bound_combobox.grid(row = 2,column = 2)

databits_label = Label(group_serial_set,text = "数据位")
databits_label.grid(row = 3,column = 1)
databits_combobox = ttk.Combobox(group_serial_set,width = 8)
databits_combobox['value'] = ("1","1.5","2")
databits_combobox.grid(row = 3,column = 2)

checkbits_label = Label(group_serial_set,text = "校验位")
checkbits_label.grid(row = 4,column = 1)
checkbits_combobox = ttk.Combobox(group_serial_set,width = 8)
checkbits_combobox['value'] = ("奇校验","偶校验","无校验")
checkbits_combobox.grid(row = 4,column = 2)


recv_set_v = IntVar()
recv_set = LabelFrame(root,text = "接收设置")
recv_set.grid(row = 1,column = 1)
recv_set_radiobutton1 = Radiobutton(recv_set,text = "ASCII",variable = recv_set_v,value = 1)
recv_set_radiobutton1.grid(row = 6,column = 1,sticky = W)
recv_set_radiobutton2 = Radiobutton(recv_set,text = "HEX",variable = recv_set_v,value = 2)
recv_set_radiobutton2.grid(row = 6,column = 2,sticky = W)

recv_set_v2 = IntVar()
recv_set_v3 = IntVar()
recv_set_v4 = IntVar()
recv_set_checkbutton1 = Checkbutton(recv_set,text = "自动换行",variable = recv_set_v2)
recv_set_checkbutton1.grid(row = 7,column = 1)
recv_set_checkbutton2 = Checkbutton(recv_set,text = "显示发送",variable = recv_set_v3)
recv_set_checkbutton2.grid(row = 8,column = 1)
recv_set_checkbutton3 = Checkbutton(recv_set,text = "显示时间",variable = recv_set_v4)
recv_set_checkbutton3.grid(row = 9,column = 1)


def RecvTimeCallback():
    print(send_set_v7.get())
    
send_set_v5 = IntVar()
send_set_v6 = IntVar()
send_set_v7 = IntVar()
send_set = LabelFrame(root,text = "发送设置")
send_set.grid(row = 2,column = 1)
send_set_radiobutton3 = Radiobutton(send_set,text = "ASCII",variable = send_set_v5,value = 3)
send_set_radiobutton3.grid(row = 11,column = 1,sticky = W)
send_set_radiobutton4 = Radiobutton(send_set,text = "HEX",variable = send_set_v5,value = 4)
send_set_radiobutton4.grid(row = 11,column = 2)
send_set_checkbutton4 = Checkbutton(send_set,text = "重复发送",variable = send_set_v6)
send_set_checkbutton4.grid(row = 12,column = 1)
Label(send_set,text = "时间间隔:").grid(row = 13,column = 1,sticky = W)
Spinbox(send_set,from_ = 0,to = 9999,textvariable = send_set_v7,command = RecvTimeCallback,width = 6).grid(row = 13,column = 2,sticky = W)

def SendCallback():
    print("发送")
    
framRCV = Frame(root,width = 500,height = 250)
framRCV.grid(row = 0,column = 2,rowspan = 2)
Text(framRCV,width = 60,height = 17,pady = 10).grid(row = 0,column = 1)
framSEND = Frame(root,width = 500,height = 80)
framSEND.grid(row = 2,column = 2)
Text(framSEND,width = 50,height = 5,pady = 10).grid(row = 0,column = 1)
Button(framSEND,text = "发送",padx = 20,command = SendCallback).grid(row = 0,column = 2)

mainloop()

八、运行

运行结果如下图,我们的串口工具GUI完成!
在这里插入图片描述

九、结语

如您在使用过程中有任何问题,请加QQ群进一步交流。

QQ交流群:906015840 (备注:物联网项目交流)。

获取资料:微信扫描下方二维码,关注公众号:一个物联网项目的前世今生。

静晨出品:静之所想,晨之所计
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值