2017-02-08 19 views
1

私は、ユーザーがボタンをクリックしてファイルを選択し、在庫番号を入力し、それらのファイルの名前を変更するためのボタンをクリックできる小さなプログラムを作成しようとしています。ボタンを押して機能を実行する(tkinter)

これは私がこれまでに作ってみたものです:

import os 
from tkinter import * 
from tkinter import ttk 
from tkinter.filedialog import askopenfilenames 

root = Tk() 
root.title("Photo Renamer") 
mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

directory = '' 
arrayOfFiles = [] 
stockNum = 0 

def getStockNumber(): 
    stockNum = stockNumber.get() 

def selectFiles(): 
    selectedFiles = askopenfilenames() 
    # Switch our files from a tuple to an array. 
    # arrayOfFiles = [] 
    for i in selectedFiles: 
     arrayOfFiles.append(i) 
    return arrayOfFiles 

def rename(array): # array will be arrayOfFiles 
    # Separate file names from the whole file path. 
    fileNames = [] 
    for i in range(len(array)): 
     fileNames.append(os.path.basename(i)) 

    count = 1 
    directory = os.path.dirname(array[1]) 
    for file in directory: 
     oldFileName = '%s/%s' % (directory, file) 
     newFileName = '%s/gma%d_%d.jpg' % (directory, stockNum, count) 
     os.rename(oldFileName, newFileName) 
     count += 1 

# "Stock Number" label 
ttk.Label(mainframe, text="Stock Number: ").grid(column=1, row=1, sticky=W) 

# Entry box 
stockNumber = ttk.Entry(mainframe, width=7) 
stockNumber.grid(column=2, row=1, sticky=(W, E)) 

# "Select Files" button 
ttk.Button(mainframe, text="Select Files", command=selectFiles).grid(column=1, row=2, sticky=(W, E)) 

# "Number of Files" label 
ttk.Label(mainframe, text="Number of Files: ").grid(column=1, row=3, sticky=W) 

# "Rename" button 
ttk.Button(mainframe, text="Rename", command= lambda: rename(arrayOfFiles)).grid(column=3, row=3, sticky=(W, E)) # command=rename 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) 
stockNumber.focus() 

root.mainloop() 

私は在庫数のファイル、および種類を選択することができますが、私は名前の変更]ボタンをクリックしたとき、それは私に、このエラーが発生しますコンソール:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__ 
    return self.func(*args) 
    File "C:/Users/.../Desktop/Python/gui.py", line 56, in <lambda> 
    ttk.Button(mainframe, text="Rename", command= lambda: rename(arrayOfFiles)).grid(column=3, row=3, sticky=(W, E)) # command=rename 
    File "C:/Users/.../Desktop/Python/gui.py", line 32, in rename 
    fileNames.append(os.path.basename(i)) 
    File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\ntpath.py", line 232, in basename 
    return split(p)[1] 
    File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\ntpath.py", line 204, in split 
    d, p = splitdrive(p) 
    File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\ntpath.py", line 139, in splitdrive 
    if len(p) >= 2: 
TypeError: object of type 'int' has no len() 

答えて

1

list.appendを行うことができます()は、文字列が必要です - あなたは整数を与えています。 変更

fileNames.append(os.path.basename(int)) 

fileNames.append(os.path.basename(str)) 

にエラーがPythonコード内に投入し(osモジュール、see the docs over herePython 2))、それは不可能であるlen(int)を得ることを試みた(intのでdoesnの」 tはメソッドを持っています__len__

0

はこれを試してみてください:

for i in range(array): 

代わりの

あなたの上記のコードで
for i in range(len(array)): 
+0

私の配列はファイル名のリストなので、私は 'for i in range(len(array)):'を使う必要がありました。 – Tedd

+0

次に、 'fileNames.append(os.path.basename(i)) 'に問題があります。なぜなら、値を取得するための文字列ではなく、文字列ではなく文字列を使用する** filepath **' fileNames.append(os。パス.basename(ファイルパス)) '。またはあなたは配列 'fileNames.append(os.path.basename(array [i]))のインデックスでそれをチェックすることもできます。 –

+0

私は投票-1ですが、なぜですか? –

1
for i in range(len(array)): 
    fileNames.append(os.path.basename(i)) 

iは整数で、os.path.basename(path)は、文字列のようなパス名を期待しています。

リストを反復処理すると、アイテムを直接反復することができます。

for file in array: 
    fileNames.append(os.path.basename(file)) 

か、インデックスを使用したい場合は、あなたが

for i in range(len(array)): 
    fileNames.append(os.path.basename(array[i])) 
             ^^^^^ notice accessing an item using index 
関連する問題