-1

I am making an excel comparing program and exporting it to a CSV file. Here is my code:

import openpyxl, csv
from tkinter import *
from tkinter.filedialog import askopenfilename
from openpyxl.utils import 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
    column_1 = column1_entry.get("1.0", "end-1c")
    print(column_1)
    return column_1


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


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)

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)


def write_csv(col1, col2, worksheet1, worksheet2):
    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)])


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


mainloop()

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

global sheet1
sheet1 = e1.get("1.0", "end-1c")

global sheet2
sheet2 = e2.get("1.0", "end-1c")


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

col1 = column1_entry.get("1.0", "end-1c")
col2 = column2_entry.get("1.0", "end-1c")

write_csv(col1, col2, worksheet1, worksheet2)

However, when I run the follwing code, I enter the criteria required and end up with the following error: _tkinter.TclError: invalid command name ".71847552". When I put mainloop() as the last line of the file, I get this error: self.fp = io.open(file, modeDict[mode]) FileNotFoundError: [Errno 2] No such file or directory: '' Can anyone rewrite my code so that it will successfully compile? Any help is great thank you

stovfl
  • 14,998
  • 7
  • 24
  • 51
Bill
  • 515
  • 1
  • 4
  • 15

1 Answers1

2

After you destroy the window, which means your code will proceed past mainloop you then attempt to reference widgets with the containing master root which have been destroyed and their associated methods get. This will raise an error if you attempt to do this after the window has been destroyed.

Pythonista
  • 11,377
  • 2
  • 31
  • 50