一. 源代码:合并工具
#UTF-8
import os
import time
from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *
from tkinter import filedialog
class mywin(LabelFrame):
def __init__(self,master=None,**configs):
super().__init__(master,**configs)
self.v1 = IntVar()
self.v2 = IntVar()
self.line1 = StringVar()
self.line2 = StringVar()
self.line3 = StringVar()
self.master.title("合并工具")
#self.master.iconbitmap('folder_128px_1229462_easyicon.net.ico')
self.f3 = Frame(self)
self.pack(padx=5,side="top",anchor="n",expand=YES,fill=X)
self.master.geometry("+500+200")
self.t1 = Text(self.f3, height=10, fon=("helvetica", 10, "underline italic"))
self.make_frame()
def make_frame(self):
f1 = Frame(self)
f1.pack(side="top",anchor="n",expand=YES,fill=X)
Label(f1, text="文件选择").pack(side="left", anchor="n")
Entry(f1,textvariable=self.line1).pack(side="left", anchor="ne", fill="x", expand=YES)
Button(f1, text="浏览", width=5,command=self.get_path).pack(anchor="n", fill="x", expand=YES)
f2 = Frame(self)
f2.pack(side="top",anchor="n",fill="x",expand="yes")
Button(f2, text="添加", width=10,command=self.put_path).pack(anchor="n", expand=YES)
self.f3.pack(side="top",anchor="n",fill="x",expand="yes")
self.t1.pack(anchor="n", fill="x", expand=YES)
f4 = Frame(self)
f4.pack(side="top",anchor="n",fill="x",expand="yes")
Checkbutton(f4, text='合并为多列', variable=self.v1).pack(side="left", anchor="n")
Checkbutton(f4, text='合并为一列', variable=self.v2).pack(side="right", anchor="n")
f5 = Frame(f4)
f5.pack(side="top", anchor="center")
Label(f5,text="分割符").pack(side="left", anchor="n")
Entry(f5, textvariable=self.line2).pack(side="left", anchor="n")
f6 = Frame(self)
f6.pack(side="top", anchor="n", expand=YES, fill=X)
Label(f6, text="保存路径").pack(side="left", anchor="n")
Entry(f6, textvariable=self.line3).pack(side="left", anchor="ne", fill="x", expand=YES)
Button(f6, text="浏览", width=5, command=self.gets_path).pack(anchor="n", fill="x", expand=YES)
f7 = Frame(self)
f7.pack(side="top", anchor="n", fill="x", expand="yes")
Button(f7, text="合并", width=10,command=self.data).pack(anchor="n", expand=YES)
def get_path(self):
self.line1.set(filedialog.askopenfilename())
def gets_path(self):
file_path = filedialog.askdirectory()
if file_path:
self.line3.set(file_path+"/"+"合并")
def put_path(self):
if self.line1.get():
self.t1.insert(END,self.line1.get()+"\n")
def data(self):
try:
data1 = []
data2 = []
data3 = []
data4 = []
save_path = self.line3.get()
if self.v1.get():
if not self.line2.get():
showwarning('提示', "请输入分割符!")
return 0
if os.path.lexists(save_path): ###判断路径文件是否存在
showwarning('提示', "文件已存在!请重新选择文件夹!")
if self.v1.get() | self.v2.get() == 0:
showwarning('提示', "请选择合并模式!")
if not self.line3.get():
showwarning('提示', "请选择保存路径!")
else:
path = self.t1.get(1.0, END).split("\n")
path = list(filter(None, path))
for i in path:
with open(i, "r") as fo:
data = fo.read().split("\n")
data = list(
filter(None, data)) # filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
# 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
data3.append(len(data))
data1.append(data)
os.mkdir(save_path)
if self.v1.get() == 1:
start = time.clock()
def chu(x):
line = str()
a = len(data1)
for i in range(a):
line += data1[i][x] + ","
return line
s = min(data3)
c = map(lambda x: chu(x), (i for i in range(s)))
a = (i[0:-1] + "\n" for i in c)
data2 = list(a)
end = time.clock()
with open(save_path + "/" + "多列.txt", "w+") as fo:
fo.writelines(data2)
print("多列合并完成!{}" .format(end - start))
showinfo("提示", "多列合并完成!")
if self.v2.get() == 1:
with open(save_path + "/" + "单列.txt", "w+") as fo:
start = time.clock()
i = (list(filter(None, i)) for i in data1)
li = (i + "\n" for l in i for i in l)
data4 = list(li)
end = time.clock()
fo.writelines(data4)
print("单列合并完成!{}".format(end - start))
showinfo("提示", "单列合并完成!")
self.t1.delete(1.0,END)
except ValueError:
showwarning('提示', "未知错误,请检查数据!")
if __name__ == "__main__":
app = mywin()
app.mainloop()
GUI 全是pack()出来的,采用了多Frame的办法,每个Frame写入指定的组件
二、messagebox库介绍及文件对话框
import tkinter
import tkinter.messagebox #弹窗库
1、提示消息框
tkinter.messagebox.showinfo(‘提示’,‘人生苦短’)
2、消息警告框
tkinter.messagebox.showwarning(‘警告’,‘明日有大雨’)
3、错误消息框
tkinter.messagebox.showerror(‘错误’,‘出错了’)
4、对话框
tkinter.messagebox.askokcancel(‘提示’, ‘要执行此操作吗’)#确定/取消,返回值true/false
tkinter.messagebox.askquestion(‘提示’, ‘要执行此操作吗’)#是/否,返回值yes/no
tkinter.messagebox.askyesno(‘提示’, ‘要执行此操作吗’)#是/否,返回值true/false
tkinter.messagebox.askretrycancel(‘提示’, ‘要执行此操作吗’)#重试/取消,返回值true/false
5、文件对话框
import tkinter.filedialog
a=tkinter.filedialog.asksaveasfilename()#返回文件名
print(a)
a =tkinter.filedialog.asksaveasfile()#会创建文件
print(a)
a =tkinter.filedialog.askopenfilename()#返回文件名
print(a)
a =tkinter.filedialog.askopenfile()#返回文件流对象
print(a)
a =tkinter.filedialog.askdirectory()#返回目录名
print(a)
a =tkinter.filedialog.askopenfilenames()#可以返回多个文件名
print(a)
a =tkinter.filedialog.askopenfiles()#多个文件流对象
三、tkinter.ttk-Tk主题小部件
tkinter.ttk-Tk主题小部件
这个tkinter.ttk模块提供对Tk8.5中引入的Tk主题小部件集的访问。如果没有针对TK8.5编译Python,则仍然可以在瓷砖已经安装好了。使用TK8.5的前一种方法提供了额外的好处,包括X11下的反别名字体呈现和窗口透明度(需要在X11上设置组合窗口管理器)。
基本思想tkinter.ttk是尽可能地将实现小部件行为的代码与实现其外观的代码分开。
要开始使用TTK,请导入其模块:
from tkinter import ttk
要覆盖基本的Tk小部件,导入应该遵循Tk导入:
from tkinter import *
from tkinter.ttk import *
该代码导致tkinter.ttk小部件(Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale和Scrollbar)自动替换Tk小部件。
这具有使用新小部件的直接好处,它提供了跨平台的更好的外观和感觉;然而,替代小部件并不完全兼容。主要区别在于,TTK小部件中不再存在“FG”、“BG”等与小部件样式有关的小部件选项。相反,使用ttk.Style类,用于改进样式效果。
另见
将现有应用程序转换为使用Tile小部件
一本关于移动应用程序使用新小部件时通常遇到的差异的专著(使用TCL术语)。
TTK小部件
TTK附带了18个小部件,其中12个已经存在于tkinter中:Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale, Scrollbar,和Spinbox…其他六项是新的:Combobox, Notebook, Progressbar, Separator, Sizegrip和Treeview…而它们都是Widget.
使用TTK小部件可以改善应用程序的外观。如前所述,样式编码的方式存在差异。
传统知识代码:
l1 = tkinter.Label(text=“Test”, fg=“black”, bg=“white”)
l2 = tkinter.Label(text=“Test”, fg=“black”, bg=“white”)
TTK代码:
style = ttk.Style()
style.configure(“BW.TLabel”, foreground=“black”, background=“white”)
l1 = ttk.Label(text=“Test”, style=“BW.TLabel”) 这里BW.TLable重要的是TLable,是什么组件就改成Txxxx,
l2 = ttk.Label(text=“Test”, style=“BW.TLabel”)
注意foreground,background参数需要使用style传入
结尾,关于多文本合并为多列数据的函数写的有点啰嗦,但是我目前只想到这个办法。
使用了两个for循环,内循环是处理多文本同索引号文本相加,形成分隔符的多列数据。
外循环是使用数据最小的文件去处理,多余的数据将会去掉。
2019/8/47更新代码,在数据处理上使用了生成器和map()函数,经测试每秒的合并为单列的数据处理能力达到了三百万行,合并为两列的则为一百五十万行/S,测试原始数据为每行64个字符串