首頁 > 軟體

利用Python的tkinter模組實現介面化的批次修改檔名

2022-08-24 18:03:15

用Python編寫過批次修改檔名的指令碼程式,程式碼很簡單,執行也比較快,唯一美中不足之處是每次批次修改檔名時都需要執行以下步驟:

  • 1)複製資料夾路徑;
  • 2)開啟指令碼程式
  • 3)替換指令碼中的資料夾路徑
  • 4)儲存指令碼程式
  • 5)執行指令碼程式

為了便於操作,最好還是弄成GUI介面,手動選擇資料夾,這樣程式也更通用。Python中的GUI庫很多,絕大部分都支援跨平臺,其中安裝python時自帶的GUI庫是tkinter,本文就學習並建立基於tkinte的批次修改檔名程式。

本文涉及的知識點包括以下幾個:

  • 1)使用tkinter.Tk建立視窗,並且呼叫geometry函數設定視窗的寬和高,需要注意的是geometry函數接收的是字串,寬度x高度,中間的乘號其實是小寫的x,用數學符號或者是大寫的X會報錯;
  • 2)佈局方式:根據參考文獻1,tkinter有pack、grid、place三種佈局方式,本文采購grid佈局方式,該方式有點類似Winfom中的TableLayoutPanel,不同之處在於不用提前設定好行數和列數,只需指定所用控制元件的行號和列號即可;
  • 3)控制元件,主要使用了標籤(tkinter.Label)、文字(tkinter.Entry)、按鈕(tkinter.Button)控制元件,tkinte通過變數繫結的方式獲取或更新文字控制元件的值。
  • 4)瀏覽資料夾,根據參考文獻2,呼叫tkinter.filedialog中的askdirectory()選擇資料夾。

全部程式碼如下所示:

# coding=gbk
import tkinter as tk
import os
from tkinter.filedialog import askdirectory
def BrowseDri():
    txtDirPath.set(askdirectory())

def BatchReplaceFileName():
    path = txtDirPath.get()
    strSign=txtRemovedContent.get()
    
    files=os.listdir(path)

    for onefile in files:
        if onefile.find(strSign)<0:
            continue
        oldname=path+"\"+onefile
        newname=path+"\"+onefile.replace(strSign,"")
        os.rename(oldname,newname)
        print(oldname,"====>",newname)

    

window=tk.Tk()
window.title('批次處理檔名')
window.geometry('600x400')

tk.Label(window,text='選擇資料夾').grid(row=0,column=0)
txtDirPath=tk.StringVar()
tk.Entry(window,textvariable=txtDirPath).grid(row=0,column=1)
tk.Button(window,text='瀏覽',command=BrowseDri).grid(row=0,column=2)

tk.Label(window,text='輸入要移除的內容:').grid(row=1,column=0)
txtRemovedContent=tk.StringVar()
tk.Entry(window,textvariable=txtRemovedContent).grid(row=1,column=1)
tk.Button(window,text='移除',command=BatchReplaceFileName).grid(row=1,column=2)
tk.mainloop()

最後是程式執行效果,如下面幾張截圖所示:執行程式後,首先選擇要批次處理的資料夾,然後設定檔名中要移除的內容,最後點選移除按鈕批次處理檔名。

上文主要實現了批次移除檔名中的指定字串,無法進行替換,本文在前面工作的基礎上,增加批次替換檔名中指定字串的功能。

新增的功能點不多,主要包括:

  • 單選框控制元件:使用tkinter.Radiobutton函數建立單選框控制元件,並用value屬性設定單選框對應的值,也即選中單選框時得到的值,提前定義好變數(本文中定義了Int變數),建立單選框控制元件時用variable屬性繫結變數。如果要設定預設選中的單選框,則直接設定變數值為指定單選框對應的value值即可;
  • 設定文字方塊的預設狀態:文字方塊使用state屬性設定文字方塊的可用狀態,包括normal/disabled,可以在建立Entry時指定檔案框的state屬性為disabled,則文字方塊預設不可用;
  • 修改控制元件屬性:除了在建立控制元件時指定屬性值之外,在程式執行過程中修改控制元件屬性有多種方式(詳見參考文獻5),本文采用通過字典鍵設定屬性方式動態修改文字方塊的可用狀態。

批次修改檔名程式的完整程式碼如所示:

# coding=gbk
import tkinter as tk
import os
from tkinter.filedialog import askdirectory
def BrowseDri():
    txtDirPath.set(askdirectory())
def SetControlStatus():
    mode=processMode.get()
    if(mode==1):
        txtRemoved['state'] = 'normal'
        txtBeforeReplaced['state'] = 'disabled'
        txtAfterReplaced['state'] = 'disabled'
        btnProcess['text']='移除'
    elif mode==2:
        txtRemoved['state'] = 'disabled'
        txtBeforeReplaced['state'] = "normal"
        txtAfterReplaced['state'] = 'normal'
        btnProcess['text']='替換'

def BatchReplaceFileName():
    path = txtDirPath.get()
    mode=processMode.get()

    if(mode==1):
        strOldSign=txtRemovedContent.get()
        strNewSign=""        
    elif mode==2:
        strOldSign=txtBeforeReplactContent.get()
        strNewSign=txtAfterReplactContent.get()

    files=os.listdir(path)
    for onefile in files:
        if onefile.find(strOldSign)<0:
            continue
        oldname=path+"\"+onefile
        newname=path+"\"+onefile.replace(strOldSign,strNewSign)
        os.rename(oldname,newname)
        print(oldname,"====>",newname)

window=tk.Tk()
window.title('批次處理檔名')
window.geometry('400x300')

tk.Label(window,text='選擇資料夾').grid(row=0,column=0)
txtDirPath=tk.StringVar()
tk.Entry(window,textvariable=txtDirPath).grid(row=0,column=1)
tk.Button(window,text='瀏覽',command=BrowseDri).grid(row=0,column=2)

processMode =tk.IntVar()
tk.Radiobutton(window, text="移除內容", variable=processMode, value=1, command=SetControlStatus).grid(row=1,column=0)
tk.Label(window,text='輸入要移除的內容:').grid(row=1,column=1)
txtRemovedContent=tk.StringVar()
txtRemoved=tk.Entry(window,textvariable=txtRemovedContent)
txtRemoved.grid(row=1,column=2)
tk.Radiobutton(window, text="替換內容", variable=processMode, value=2, command=SetControlStatus).grid(row=2,column=0)
tk.Label(window,text='輸入替換前的內容:').grid(row=2,column=1)
txtBeforeReplactContent=tk.StringVar()
txtBeforeReplaced=tk.Entry(window,textvariable=txtBeforeReplactContent,state='disabled')
txtBeforeReplaced.grid(row=2,column=2)
tk.Label(window,text='輸入替換後的內容:').grid(row=3,column=1)
txtAfterReplactContent=tk.StringVar()
txtAfterReplaced=tk.Entry(window,textvariable=txtAfterReplactContent,state='disabled')
txtAfterReplaced.grid(row=3,column=2)

processMode.set(1)

btnProcess=tk.Button(window,text='移除',command=BatchReplaceFileName)
btnProcess.grid(row=4,column=0)
tk.mainloop()

最後是程式效果,如下圖所示,選擇指定資料夾,首先將資料夾中所有檔案中的car字串替換為che@,接著再移除檔名中的@字元。

到此這篇關於利用Python的tkinter模組實現介面化的批次修改檔名的文章就介紹到這了,更多相關Python tkinter批次修改檔名內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com