tkinter 学习

一. 源代码:合并工具

#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个字符串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值