forked from logzhan/NotesUESTC
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()
|
||
```
|
||
|