2017-06-07 1 views
3

J'ai un programme qui utilise tkinter et openpyxl pour faire un excellent programme de comparaison. Voici mon code:Tkinter et openpyxl erreur aucun tel fichier ou répertoire ''

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

Le programme plante et me donne l'erreur suivante: No such file or directory '' et je ne suis pas sûr que ce sera pleinement fonctionner comme prévu. Quelqu'un peut-il réécrire mon code pour le faire compiler en douceur? Tout est génial

+0

Quelqu'un peut-il m'aider s'il vous plaît? – Bill

+2

Veuillez créer un [mcve]. Vous avez publié beaucoup de code qui ne semble pas faire partie du problème. Aussi, pourquoi appelez-vous 'quit' et le plus tard essayant de créer plus de widgets? Il est très inhabituel d'avoir plus de code GUI après l'appel de 'mainloop'. –

+0

@BryanOakley J'ai clarifié ma réponse quelqu'un peut-il s'il vous plaît aider J'ai une date limite pour le 15 Juin s'il vous plaît quelqu'un !! – Bill

Répondre

1

D'après ce que je peux voir de votre code, le problème est que vous n'avez pas réellement ajouté les noms de fichiers aux variables que vous essayez d'utiliser.

Ainsi, lorsque votre programme obtient les lignes où workbook1, workbook2, worksheet1 et worksheet2 sont le programme tente d'exécuter la commande openpyxl.load_workbook(str(wb1)) avant les variables wb1, wb2, wb1, sheet1 et sheet2 ont été créés. Vous devez avoir les fonctions qui demandent le nom de fichier à attribuer aux variables à appeler avant de créer les éléments suivants:

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

Voici un exemple de ce que vous pouvez faire pour y parvenir.

Ce n'est pas le meilleur moyen, ni même un bon moyen, mais il fonctionnera pour vos besoins pressés et donnera un exemple de ce qui est nécessaire pour que vos cahiers d'exercices et feuilles de travail soient traités correctement.

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 

Vous devrez faire cela pour toujours une fonction qui applique un nom de fichier à une variable avant de travailler avec les variables.

Gardez à l'esprit l'exemple que je donnais est juste pour illustrer ce qui doit arriver avant de faire quoi que ce soit avec les variables workbook1, workbook2, worksheet1 et worksheet2. Vous voudrez peut-être revoir et modifier votre code afin que ce ne soit pas un problème dans le futur.

Peut-être ajouter cette 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)) 

à une fonction qui est appelée après chaque wb1, wb2, wb1, sheet1 et sheet2 ont été créés.

+0

réponse très claire merci – Bill

+0

Si cette réponse vous a été utile, merci d'appliquer la prime à cette réponse: D –