NotesUESTC/编程语言笔记/Python笔记/Tkinter使用样例.md

176 lines
5.7 KiB
Markdown
Raw Permalink Normal View History

2024-03-27 11:19:08 +08:00
## 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()
```