176 lines
5.7 KiB
Markdown
176 lines
5.7 KiB
Markdown
|
## Tkinter(Python便捷GUI库)笔记
|
|||
|
|
|||
|
```python
|
|||
|
import tkinter as tk # 在代码里面导入库,起一个别名,以后代码里面就用这个别名
|
|||
|
from tkinter import messagebox
|
|||
|
import os
|
|||
|
import shutil
|
|||
|
import threading
|
|||
|
|
|||
|
def thread_it(fc):
|
|||
|
t = threading.Thread(target=fc)
|
|||
|
t.setDaemon(True)
|
|||
|
t.start()
|
|||
|
|
|||
|
|
|||
|
def ShowFinish(e):
|
|||
|
'''创建弹窗'''
|
|||
|
messagebox.showinfo("窗口名称", "点击成功")
|
|||
|
|
|||
|
def copy_file(paths,patht):
|
|||
|
same_file_num = 0
|
|||
|
copy_file_num = 0
|
|||
|
for filename in os.listdir(paths):
|
|||
|
filename_s = paths + os.sep + filename
|
|||
|
filename_t = patht + os.sep + filename
|
|||
|
|
|||
|
#avi2mp4(filename_s)
|
|||
|
|
|||
|
# 如果是文件夹,那么递归处理
|
|||
|
if os.path.isdir(filename_s):
|
|||
|
if not os.path.exists(filename_t):
|
|||
|
os.mkdir(filename_t)
|
|||
|
copy_file(filename_s,filename_t)
|
|||
|
else:
|
|||
|
if os.path.exists(filename_t):
|
|||
|
#print("[*] "+ filename_t + " already exists! ")
|
|||
|
same_file_num = same_file_num + 1
|
|||
|
# 如果目标属于文件,且目标文件夹不存在,那么拷贝文件
|
|||
|
else:
|
|||
|
print("Copy Source :" + filename_s)
|
|||
|
print("To Target :" + filename_t)
|
|||
|
copy_file_num = copy_file_num + 1
|
|||
|
try:
|
|||
|
shutil.copyfile(filename_s, filename_t)
|
|||
|
except IOError as e:
|
|||
|
print("Unable to copy file. %s" % e)
|
|||
|
exit(1)
|
|||
|
except:
|
|||
|
print("Unexpected error: exit")
|
|||
|
exit(1)
|
|||
|
|
|||
|
if(copy_file_num > 0):
|
|||
|
print(paths + ": sync file count = " + str(copy_file_num))
|
|||
|
|
|||
|
#--------------------------------------------------------------------------------
|
|||
|
# Function : search_diff_file_and_del
|
|||
|
# Description : 以paths为参考,删除patht与paths不同的文件
|
|||
|
# Date : 2023-02-09 loghzan
|
|||
|
#--------------------------------------------------------------------------------
|
|||
|
def search_diff_file(patht,paths,diff_list):
|
|||
|
same_file_num = 0
|
|||
|
copy_file_num = 0
|
|||
|
for filename in os.listdir(patht):
|
|||
|
filename_t = patht + os.sep + filename
|
|||
|
filename_s = paths + os.sep + filename
|
|||
|
# 如果是文件夹,那么递归处理
|
|||
|
if os.path.isdir(filename_t):
|
|||
|
if os.path.exists(filename_s):
|
|||
|
search_diff_file(filename_t,filename_s,diff_list)
|
|||
|
else:
|
|||
|
print("rm target path" + filename_t)
|
|||
|
# 递归删除文件夹
|
|||
|
#shutil.rmtree(filename_t)
|
|||
|
else:
|
|||
|
if os.path.exists(filename_s):
|
|||
|
#print("[*] "+ filename_t + " already exists! ")
|
|||
|
same_file_num = same_file_num + 1
|
|||
|
# 如果目标属于文件,且源文件夹不存在,加入列表,最后删除
|
|||
|
else:
|
|||
|
#print("[*] Source :" + filename_s)
|
|||
|
diff_list.append(filename_t)
|
|||
|
#print("[*] Target :" + filename_t)
|
|||
|
copy_file_num = copy_file_num + 1
|
|||
|
|
|||
|
# 利用ffmpeg 将avi文件转换为mp4
|
|||
|
def avi2mp4(path):
|
|||
|
if (path.find(".avi") == -1) and (path.find(".wmv") == -1):
|
|||
|
return
|
|||
|
# 输入视频路径
|
|||
|
video_path = path
|
|||
|
# 修改avi后缀为mp4
|
|||
|
out_video_path = video_path[0:len(video_path)-4] + ".mp4"
|
|||
|
|
|||
|
cmd_str = ""
|
|||
|
if(path.find("avi") != -1):
|
|||
|
# 生成命令path
|
|||
|
cmd_str = "ffmpeg" + " -i " + "\"" + video_path + "\"" + " -c copy -map 0 "
|
|||
|
cmd_str = cmd_str + "\"" + out_video_path + "\""
|
|||
|
if(path.find("wmv") != -1):
|
|||
|
cmd_str = "ffmpeg" + " -i " + "\"" + video_path + "\"" + " "
|
|||
|
cmd_str = cmd_str + "\"" + out_video_path + "\""
|
|||
|
print(cmd_str)
|
|||
|
os.system(cmd_str)
|
|||
|
#os.remove(path)
|
|||
|
print("finsh convert avi to mp4")
|
|||
|
return
|
|||
|
|
|||
|
print(cmd_str)
|
|||
|
os.system(cmd_str)
|
|||
|
os.remove(path)
|
|||
|
print("finsh convert avi to mp4")
|
|||
|
|
|||
|
|
|||
|
def sync_file(local,cloud):
|
|||
|
copy_file(local, cloud)
|
|||
|
# 找出目标文件夹存在,但是源文件夹不存在的文件
|
|||
|
diff_list = []
|
|||
|
search_diff_file(cloud,local,diff_list)
|
|||
|
# 删除源文件夹不存在的文件
|
|||
|
for i in range(0, len(diff_list)):
|
|||
|
print("delete target : " + diff_list[i])
|
|||
|
os.remove(str(diff_list[i]))
|
|||
|
print("sync file finish")
|
|||
|
|
|||
|
def local2cloud(local,cloud):
|
|||
|
thread_it(lambda:sync_file(local, cloud))
|
|||
|
|
|||
|
def local2back(local, back):
|
|||
|
thread_it(lambda:sync_file(local, back))
|
|||
|
|
|||
|
# 从src端拷贝不同的文件到目标端
|
|||
|
def copy_diff(src, dst):
|
|||
|
thread_it(lambda:copy_file(src, dst))
|
|||
|
|
|||
|
def cloud2local(cloud,local):
|
|||
|
copy_diff(cloud, local)
|
|||
|
print("cloud sycn local finish")
|
|||
|
|
|||
|
back = "D:\\UBUNTU\\ubuntu\我的资料\我的收藏\\"
|
|||
|
local = "F:\\我的收藏\\"
|
|||
|
cloud = "I:\\115\\我的收藏\\"
|
|||
|
|
|||
|
# 这个库里面有Tk()这个方法,这个方法的作用就是创建一个窗口
|
|||
|
root = tk.Tk()
|
|||
|
# 设置标题
|
|||
|
root.title('磁盘同步工具GUI v1.0.0')
|
|||
|
# (宽度x高度)+(x轴+y轴)
|
|||
|
root.geometry("320x150+630+80")
|
|||
|
|
|||
|
|
|||
|
label1 = tk.Label(text="云端路径:")
|
|||
|
label1.place(x = 10, y = 10)
|
|||
|
label2 = tk.Label(text="本地路径:")
|
|||
|
label2.place(x = 10, y = 30)
|
|||
|
label3 = tk.Label(text="备份路径:")
|
|||
|
label3.place(x = 10, y = 50)
|
|||
|
|
|||
|
label1["text"] = "云端路径: " + cloud
|
|||
|
label2["text"] = "本地路径: " + local
|
|||
|
label3["text"] = "备份路径: " + back
|
|||
|
|
|||
|
|
|||
|
btn1 = tk.Button(text='本地同步云端', command = lambda:local2cloud(local, cloud))
|
|||
|
btn1.place(x = 10, y = 100)
|
|||
|
|
|||
|
btn2 = tk.Button(text='云端同步本地', command = lambda:cloud2local(cloud, local))
|
|||
|
btn2.place(x = 110, y = 100)
|
|||
|
|
|||
|
btn3 = tk.Button(text='本地同步备份', command = lambda:local2back(local, back))
|
|||
|
btn3.place(x = 210, y = 100)
|
|||
|
|
|||
|
# 启动线程循环看到窗口
|
|||
|
root.mainloop()
|
|||
|
```
|
|||
|
|