python3.6+tkinterGUI编程实现界⾯化的⽂本处理⼯具(推荐)
更新:
2017.07.17  补充滚动条、win批处理拉起py
2017.08.13  新增⾃定义图标
⼀、背景:
1.⼯作中⾃⼰及同事在查数据库、测试接⼝时需要对⼀些字符串或json串作预处理,⽬前这些问题⽹上均有在线转换的⼯具,但很繁杂,可能需要打开⼏个⽹页窗⼝;
2.之前做的⽂本处理⼯具是基于cmd命令⾏的,不太友好;
3.⾃⼰做的⼀些⼩⼯具也基本都是命令⾏执⾏的,也想接触下GUI;
基于以上,了解到python⾃带的tkinter库可以初步满⾜UI的需求,业余时间做了个图形化⼯具,涉及窗⼝、⽂本、按钮、标签、菜单、菜单树、滚动条、⽂件处理、界⾯布局等;
下⽂将梳理从零到完成的全过程,作为⾃⼰GUI学习的⼀个总结;
ps:后⾯版本间隙有时间的话想试试⽤pyQt来做。。tkinter做出的界⾯确实。。。23333
⼯具界⾯截图:   
⼆、实现
1.安装所需要的库 ps:环境是win7+python 3.6,tkinter是py的标准库,即:如不涉及EXCEL处理,可跳过此步骤;使⽤python处理Excel表格,后⾯有时间会单独整理
(1)et-xmlfile  openpyxl安装需要依赖,⼯具⾥有涉及处理EXCEL(xlsx),需要⽤到openpyxl库;
(2)jdcal    同上
(3)openpyxl  处理EXCEL(xlsx)
(4)xlrd    读取EXCEL(xls)
(5)xlwt    写⼊EXCEL(xls)
(6)xltils    配合上⾯两个库对已存在表格进⾏修改
2.新建⽗窗⼝(可理解为界⾯的最底层)
>>>>>>>>>>>>>
#author: 陈⽉⽩
#_blogs: wwwblogs/chenyuebai/
>>>>>>>>>>>>>
from tkinter import *
def gui_start():
init_window = Tk()  #实例化出⼀个⽗窗⼝
init_window.mainloop() #⽗窗⼝进⼊事件循环,可以理解为保持窗⼝运⾏,否则界⾯不展⽰
gui_start()
运⾏结果:
- - - - - - - - - - - -- - - - - - - - - - - -- - - - - - - - - - - -- - - - - - - - - - - -
运⾏会弹出上图所⽰的空⽩窗⼝,这⾥我们还可以修改窗⼝默认⼤⼩、默认弹出位置、窗⼝名、⽗窗⼝颜⾊、虚化等等;
init_window.title("⽂本处理⼯具 by: 陈⽉⽩")
ry('290x160+10+10')  #290 160为窗⼝⼤⼩,+10 +10 定义窗⼝弹出时的默认展⽰位置
init_window["bg"] = "pink"    #窗⼝背景⾊,其他背景⾊见:blog.csdn/chl0000/article/details/7657887
init_window.attributes("-alpha",0.8)  #虚化值越⼩虚化程度越⾼
注意要加在 init_window.mainloop() 之前;
运⾏结果:
整理下代码:
>>>>>>>>>>>>>
#author: 陈⽉⽩
#_blogs: wwwblogs/chenyuebai/
>>>>>>>>>>>>>
from tkinter import *import hashlib
class MY_GUI():
字符串截取工具
def __init__(self,init_window_name):
self.init_window_name = init_window_name
#设置窗⼝
def set_init_window(self):
self.init_window_name.title("⽂本处理⼯具_v1.2 by: 陈⽉⽩")  #窗⼝名
self.init_ry('1068x680+10+10')    #290 160为窗⼝⼤⼩,+10 +10 定义窗⼝弹出时的默认展⽰位置
self.init_window_name["bg"] = "pink"      #窗⼝背景⾊,其他背景⾊见:blog.csdn/chl0000/article/details/7657887
self.init_window_name.attributes("-alpha",0.9)    #虚化,值越⼩虚化程度越⾼
def gui_start():
init_window = Tk()    #实例化出⼀个⽗窗⼝
ZMJ_PORTAL = MY_GUI(init_window)
# 设置根窗⼝默认属性
ZMJ_PORTAL.set_init_window()
init_window.mainloop()  #⽗窗⼝进⼊事件循环,可以理解为保持窗⼝运⾏,否则界⾯不展⽰
gui_start()
先到这,有时间再整理。。
--------------------------------------------------------------------------------
继续。
3.⽗窗⼝完成后,即可基于⽗窗⼝创建其他组件
下⾯以“字符串转MD5”为例,介绍数据读取、按钮、布局、事件触发、后台转换处理、界⾯展⽰结果;
(1)标签
标签可以使⽤tkinter⾥的Label()⽅法,⽣成标签,括号内可带⼊其他属性参数;
⽣成标签后需使⽤grid()或者pack()⽅法使其展⽰; 
#注:tkinter对于同⼀个⽗窗⼝,只可允许使⽤⼀种布局函数;另外还有个place()⽅法,不过⽬前我还没⽤过;
self.init_data_label = Label(self.init_window_name, text="待处理数据")
self.init_id(row=0, column=0)
这⾥正好提⼀下grid(),说下我的理解。grid()⽅法是tkinter库⾃带的布局函数,他可以将⽗窗⼝分割成类似⼀个Excel表格,对单个组件按照参数中传递的row、column放置在指定位置,并展⽰;
下图红框部分,代表整个⽗窗⼝界⾯:
代码中的:self.init_id(row=0, column=0)   
代表将“init_data_label”这个标签放置在页⾯的第⼀⾏,第⼀列的位置(即左上⾓),并展⽰;
(2)⽂本框
tkinter库中的Text()⽅法,可以创建⼀个⽂本框,⽤于数据的录⼊和结果展⽰;Text()⽅法可以传⼊其他参数值,⽤于定义如背景颜⾊,前景⾊,字体,字号、字⾊等
self.init_data_Text = Text(self.init_window_name, width=67, height=35) #原始数据录⼊框
self.init_id(row=1, column=0, rowspan=10, columnspan=10)
self.init_id(row=1, column=0, rowspan=10, columnspan=10) #"rowspan=10" 是grid()⽅法的⼀个参数,⽤于指定该组件(init_data_Text)占⽤的⾏数,同理columnspan⽤于指定占⽤列数;
(3)按钮
按钮的创建可以使⽤Button()⽅法实现,可⾃定义按钮⼤⼩,宽度,按钮⽂本,背景⾊,以及需要触发的事件;
#按钮
self.str_trans_to_md5_button = Button(self.init_window_name, text="字符串转MD5", bg="lightblue", width=10,command=self.str_trans_to_md5) # 调⽤内部⽅法加()为直接调⽤
self.str_trans_to_id(row=1, column=11)
触发事件:在定义按钮时,使⽤command=functionname这个参数来指定;当按钮被点击,就会调⽤command后的⽅法,从⽽完成事件的触发;
这⾥有个⼩坑。。。就是command后跟函数名时,不可加括号,否则在代码执⾏时,就会触发该函数;
举个例⼦,上⾯贴的代码中“command=self.str_trans_to_md5”若写为“command=self.str_trans_to_md5()”,该gui_test.py在执⾏时便会调⽤类中的
self.str_trans_to_md5()⽅法,⽽不是在点击按钮时才触发;
(4)事件代码:后台的处理
step3中在定义按钮时,会选择触发⼀个事件(或称为函数),函数的实现涉及:从界⾯⽂本框中读取待处理数据---逻辑处理---界⾯结果⽂本框展⽰
code:
def str_trans_to_md5(self):
src = self.init_(1.0,END).strip().replace("\n","").encode()
#print("src =",src)
if src:
try:
myMd5 = hashlib.md5()
myMd5.update(src)
myMd5_Digest = myMd5.hexdigest()
#print(myMd5_Digest)
#输出到界⾯
except:
else:
print("ERROR") #界⾯左下⾓会有⽇志框,⽀持动态打印,下⾯会提到
读取待处理数据:对之前定义的self.init_data_Text(待处理数据⽂本框)可使⽤tkinter库中⾃带的get()⽅法,获取⽂本框中的内容,str类型;
逻辑处理:MD5加密,不展开了,从⽹上的例⼦照着敲;
界⾯结果⽂本框展⽰:对获取的字符串处理后,即可使⽤Text.insert(index,strdata)⽅法插⼊结果⽂本框:sult_data_Text;
插⼊前建议先清理下,Text.delete(1.0,END)代表将⽂本框从第⼀⾏删除⾄最后⼀⾏,即清空;
(5)⽇志打印
和上⾯没啥区别,直接贴代码了~
def get_current_time(self):
current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
return current_time
#⽇志动态打印
def write_log_to_Text(self,logmsg):
global LOG_LINE_NUM
current_time = _current_time()
logmsg_in = str(current_time) +" " + str(logmsg) + "\n"  #换⾏
if LOG_LINE_NUM <= 7:
self.log_data_Text.insert(END, logmsg_in)
LOG_LINE_NUM = LOG_LINE_NUM + 1
else:
self.log_data_Text.delete(1.0,2.0)
self.log_data_Text.insert(END, logmsg_in)
#移动光标
self.log_data_Text.focus_force()
整体的例⼦代码如下:
>>>>>>>>>>>>>
#author: 陈⽉⽩
#_blogs: wwwblogs/chenyuebai/
>>>>>>>>>>>>>
from tkinter import *
import hashlib
import time
LOG_LINE_NUM = 0
class MY_GUI():
def __init__(self,init_window_name):
self.init_window_name = init_window_name
#设置窗⼝
def set_init_window(self):
self.init_window_name.title("⽂本处理⼯具_v1.2 by: 陈⽉⽩")  #窗⼝名
#self.init_ry('320x160+10+10')      #290 160为窗⼝⼤⼩,+10 +10 定义窗⼝弹出时的默认展⽰位置
self.init_ry('1068x681+10+10')
#self.init_window_name["bg"] = "pink"        #窗⼝背景⾊,其他背景⾊见:blog.csdn/chl0000/article/details/7657887
#self.init_window_name.attributes("-alpha",0.9)      #虚化,值越⼩虚化程度越⾼
#标签
self.init_data_label = Label(self.init_window_name, text="待处理数据")
self.init_id(row=0, column=0)
self.log_label = Label(self.init_window_name, text="⽇志")
self.id(row=12, column=0)
#⽂本框
self.init_data_Text = Text(self.init_window_name, width=67, height=35) #原始数据录⼊框
self.init_id(row=1, column=0, rowspan=10, columnspan=10)
self.log_data_Text = Text(self.init_window_name, width=66, height=9) # ⽇志框
self.log_id(row=13, column=0, columnspan=10)
#按钮
self.str_trans_to_md5_button = Button(self.init_window_name, text="字符串转MD5", bg="lightblue", width=10,command=self.str_trans_to_md5) # 调⽤内部⽅法加()为直接调⽤  self.str_trans_to_id(row=1, column=11)
#功能函数
def str_trans_to_md5(self):
src = self.init_(1.0,END).strip().replace("\n","").encode()
#print("src =",src)
if src:
try:
myMd5 = hashlib.md5()
myMd5.update(src)
myMd5_Digest = myMd5.hexdigest()
#print(myMd5_Digest)
#输出到界⾯
self.write_log_to_Text("INFO:str_trans_to_md5 success")
except:
else:
self.write_log_to_Text("ERROR:str_trans_to_md5 failed")
#获取当前时间
def get_current_time(self):
current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
return current_time
#⽇志动态打印
def write_log_to_Text(self,logmsg):
global LOG_LINE_NUM
current_time = _current_time()
logmsg_in = str(current_time) +" " + str(logmsg) + "\n"  #换⾏
if LOG_LINE_NUM <= 7:
self.log_data_Text.insert(END, logmsg_in)
LOG_LINE_NUM = LOG_LINE_NUM + 1
else:
self.log_data_Text.delete(1.0,2.0)
self.log_data_Text.insert(END, logmsg_in)
def gui_start():
init_window = Tk()    #实例化出⼀个⽗窗⼝
ZMJ_PORTAL = MY_GUI(init_window)
# 设置根窗⼝默认属性
ZMJ_PORTAL.set_init_window()
init_window.mainloop()  #⽗窗⼝进⼊事件循环,可以理解为保持窗⼝运⾏,否则界⾯不展⽰
gui_start()
上⾯例⼦代码的执⾏结果:
⼤概就是这些,其他功能、按钮⼤同⼩异,就不赘述了;
有问题欢迎留⾔交流;
后⾯有时间会补充⽤windows批处理拉起python代码,这样就可以像普通软件⼀样使⽤这个⼩⼯具了;
2017.07.14
--------------------------------------------------------------------------------
继续。
(6)滚动条
对于展⽰长⽂本,需要在Text⽂本框侧翼(或下⽅)提供滚动条;tkinter库中提供Scrollbar()⽅法创建⼀个滚动条
# 滚动条
ps1:滚动条与待绑定的组件(Text或其他)时,需要⼆者相互绑定,从⽽达到拖动任意⼀⽅,对应⽅同步移动;ps2:grid()中rowspan的值最好取Text⽂本框的值,可以使滚动条长度完美贴合⽂本框
效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

burp hae 正则
« 上一篇
正则表达式规格
下一篇 »

发表评论