2017-06-07 11 views
3

私はtkinterとopenpyxlを使ってプログラムを比較するプログラムを作成しました。ここに私のコードです:Tkinterとopenpyxlでそのようなファイルやディレクトリが見つかりません '

import openpyxl, csv 
from tkinter import * 
from tkinter.filedialog import askopenfilename 
from openpyxl.utils import get_column_letter, column_index_from_string 

output = open('differences.csv', 'w', newline='') 
output_writer = csv.writer(output) 

wb1, wb2 = '', '' 
sheet1, sheet2 = '', '' 
column_1, column_2 = '', '' 

root = Tk() 
root.configure(background='light green') 
root.geometry("500x500") 
root.wm_title("BananaCell") 

e1 = Text(root, width=15, height=1) 
e1.pack() 
e1.place(x=70, y=150) 

e2 = Text(root, width=15, height=1) 
e2.pack() 
e2.place(x=300, y=150) 

column1_entry = Text(root, width=5, height=1) 
column1_entry.pack() 
column1_entry.place(x=135, y=250) 

column2_entry = Text(root, width=5, height=1) 
column2_entry.pack() 
column2_entry.place(x=385, y=250) 


def destroy(): 
    root.destroy() 


def ask_for_filename_1(): 
    global wb1 
    wb1 = askopenfilename(title="Select Workbook 1") 
    print(str(wb1)) 
    return wb1 


def ask_for_filename_2(): 
    global wb2 
    wb2 = askopenfilename(title="Select Workbook 1") 
    print(str(wb2)) 
    return wb2 


def ask_for_sheet1(): 
    global sheet1 
    sheet1 = e1.get("1.0", "end-1c") 
    print(sheet1) 
    return sheet1 


def ask_for_sheet2(): 
    global sheet2 
    sheet2 = e2.get("1.0", "end-1c") 
    print(sheet2) 
    return sheet2 


def get_col_1(): 
    global column_1 
    c1 = column1_entry.get("1.0", "end-1c") 
    print(c1) 


def get_col_2(): 
    global column_2 
    c2 = column2_entry.get("1.0", "end-1c") 
    print(c2) 

filename_button1 = Button(root, text="Workbook 1", width=12, height=2, command=ask_for_filename_1) 
filename_button1.pack() 
filename_button1.place(x=100, y=100) 

filename_button2 = Button(root, text="Workbook 2", width=12, height=2, 
command=ask_for_filename_2) 
filename_button2.pack() 
filename_button2.place(x=300, y=100) 

col_button1 = Button(root, text="Enter", width=5, height=1, command=get_col_1) 
col_button1.pack() 
col_button1.place(x=185, y=248) 

col_button2 = Button(root, text="Enter", width=5, height=1, command=get_col_2) 
col_button2.pack() 
col_button2.place(x=435, y=248) 

col1 = column_1 
col2 = column_2 

sheet_button1 = Button(root, text="Enter", width=6, height=0, 
command=ask_for_sheet1) 
sheet_button1.pack() 
sheet_button1.place(x=15, y=147) 

sheet_button2 = Button(root, text="Enter", width=6, height=0, command=ask_for_sheet2) 
sheet_button2.pack() 
sheet_button2.place(x=430, y=147) 

label1 = Label(root, text="Sheet 1 column letter: ", bg="light green") 
label1.pack() 
label1.place(x=10, y=250) 

label2 = Label(root, text="Sheet 2 column letter: ", bg = "light green") 
label2.pack() 
label2.place(x=260, y=250) 


workbook1 = openpyxl.load_workbook(str(wb1)) 
workbook2 = openpyxl.load_workbook(str(wb2)) 

worksheet1 = workbook1.get_sheet_by_name(str(sheet1)) 
worksheet2 = workbook2.get_sheet_by_name(str(sheet2)) 

col1 = column_1 
col2 = column_2 


def show(): 
    scrollbar = Scrollbar(root) 
    scrollbar.pack(side=RIGHT, fill=Y) 
    textbox = Text(root, wrap=WORD, yscrollcommand=scrollbar.set) 
    textbox.pack() 
    textbox.place(x=300, y=200) 
    for (col, col_1) in zip(worksheet1.iter_cols(min_col = column_index_from_string(col1), max_col=column_index_from_string(col1)), worksheet2.iter_cols(min_col = column_index_from_string(col2), max_col=column_index_from_string(col2))): 
     for (cell, cell_1) in zip(col, col_1): 
      if cell.value != cell_1.value and cell.row == cell_1.row: 
       textbox.insert(INSERT, 'Row ' + str(cell.row) + ' ' + 
str(cell.value) + ' is not equal to ' + str(cell_1.value) + ' ' + 'Row ' + str(cell_1.row) + '\n') 


def write_csv(): 
    for (col, col_1) in zip(worksheet1.iter_cols(min_col = column_index_from_string(col1), max_col=column_index_from_string(col1)), worksheet2.iter_cols(min_col = column_index_from_string(col2), max_col=column_index_from_string(col2))): 
     for (cell, cell_1) in zip(col, col_1): 
      if cell.value != cell_1.value and cell.row == cell_1.row: 
       output_writer.writerow(['Sheet 1 value: ' + ' ' + str(cell.value) + ' ' + 'is not equal to ' + ' ' + 'Sheet 2 value: ' + ' ' + str(cell_1.value) + ' ' + 'on row ' + ' ' + str(cell.row)]) 

show_button = Button(root, text="Show", width=8, height=1, command=show) 
show_button.pack() 
show_button.place(x=1, y=20) 

button_export = Button(root, text="Export to CSV", width=10, height=1, command=write_csv) 
button_export.pack() 
button_export.place(x=450, y=60) 

dButton = Button(root, text="Done", width=8, height=1, command=destroy) 
dButton.pack() 
dButton.place(x=100, y=60) 

mainloop() 

プログラムがクラッシュし、私に次のエラー与える:No such file or directory ''を、私は予定通り、それは完全に実行されることを確認していません。誰も私のコードをスムーズにコンパイルできるように書き換えることができますか?何かが大丈夫です

+0

誰でもお手伝いできますか? – Bill

+2

[mcve]を作成してください。あなたは、問題の一部ではないように見える多くのコードを投稿しました。また、なぜあなたは 'quit'を呼び出して、後でもっと多くのウィジェットを作成しようとしていますか? 'mainloop'を呼び出した後、より多くのGUIコードを持つことは非常に珍しいことです。 –

+0

@ブライアンオークリー私は答えを明確にしてくれました。誰かが6月15日の締め切りを迎えるのを助けてくれますか? – Bill

答えて

1

あなたのコードは私が見ることができるので、あなたが実際に使用しようとしている変数にファイル名を追加していないためです。

あなたのプログラムがラインworkbook1workbook2worksheet1、およびworksheet2になったときにそうプログラムは、変数wb1前にコマンドopenpyxl.load_workbook(str(wb1))を実行しようとwb2wb1sheet1、およびsheet2が作成されているされています。あなたは次のものを作成する前に呼ばれるように変数に割り当てるファイル名を尋ねた機能を持っている必要があります。ここでは

workbook1 = openpyxl.load_workbook(str(wb1)) 
workbook2 = openpyxl.load_workbook(str(wb2)) 

worksheet1 = workbook1.get_sheet_by_name(str(sheet1)) 
worksheet2 = workbook2.get_sheet_by_name(str(sheet2)) 

は、あなたがこれを達成するために何をしたいかもしれないものの一例です。

これは最善の方法ではなく、良い方法でもありませんが、急いであなたのニーズに対応し、ワークブックとワークシートを適切に処理するために必要なものの例を示します。

def ask_for_filename_1(): 
    global wb1 
    wb1 = askopenfilename(title="Select Workbook 1") 
    print(str(wb1)) 
    return wb1 

ask_for_filename_1() # add this line 

def ask_for_filename_2(): 
    global wb2 
    wb2 = askopenfilename(title="Select Workbook 1") 
    print(str(wb2)) 
    return wb2 

ask_for_filename_2() # add this line 

この変数を使用する前に、ファイル名を変数に適用する関数のために、これを行う必要があります。

私が与えた例では、ちょうどあなたが変数workbook1workbook2worksheet1、およびworksheet2で何かをする前に発生する必要があるか説明することです覚えておいてください。これは将来的には問題にならないように、コードを見直して変更することをお勧めします。

workbook1 = openpyxl.load_workbook(str(wb1)) 
workbook2 = openpyxl.load_workbook(str(wb2)) 

worksheet1 = workbook1.get_sheet_by_name(str(sheet1)) 
worksheet2 = workbook2.get_sheet_by_name(str(sheet2)) 
wb1後に呼び出される関数へ

wb2wb1sheet1、およびsheet2が作成されています:

たぶん、このセクションを追加します。

+0

非常に明確な答え – Bill

+0

この回答が参考になった場合は、この回答に賞金を適用することを検討してください:D –

関連する問題