Tkinter and openpyxl no such file or directory ''

I have a program that uses tkinter and openpyxl to create an excel comparison program. Here is my code:

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()

      

The program crashes and gives me the following error: No such file or directory ''

and I'm not sure if it will fully run as planned. Can anyone rewrite my code so that it compiles smoothly? Everything is fine [/ p>

+3


source to share


1 answer


From what I can see in your code, the problem is that you are not actually adding the filenames to the variables you are trying to use.

So when your program enters the line, where workbook1

, workbook2

, worksheet1

and worksheet2

, the program attempts to run a command openpyxl.load_workbook(str(wb1))

to the variables wb1

, wb2

, wb1

, sheet1

and sheet2

. You need to have functions that ask for a filename to assign to the variables being called before creating the following:

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))

      

Here's an example of what you can do to accomplish this.

This is not the best way, or even a good way, but it will work for your needs in a hurry and provide an example of what is needed for your books and worksheets to work properly.

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

      



you will need to do this forever with a function that applies the filename to a variable before working on the specified variables.

Keep in mind that I have cited the example just illustrates what needs to happen before anything to do with the variables workbook1

, workbook2

, worksheet1

and worksheet2

. You can review and modify your code so that this is not a problem in the future.

Maybe add this section:

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))

      

a function that is called after each wb1

, wb2

, wb1

, sheet1

and sheet2

.

+1


source







All Articles