繁体   English   中英

Tkinter和openpyxl错误没有这样的文件或目录''

[英]Tkinter and openpyxl error no such file or directory ''

我有一个程序使用tkinter和openpyxl来制作一个excel比较程序。 这是我的代码:

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 ''我不确定它是否会按计划完全运行。 任何人都可以重写我的代码,使其顺利编译? 一切都很棒

从我所看到的代码中我看到的问题是因为您实际上没有将文件名添加到您尝试使用的变量中。

因此,当你的程序到达workbook1workbook2worksheet1worksheet2openpyxl.load_workbook(str(wb1)) ,程序试图在变量wb1wb2wb1sheet1sheet2之前运行命令openpyxl.load_workbook(str(wb1))创建。 在创建以下内容之前,需要将要求文件名的函数分配给要调用的变量:

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

在处理所述变量之前,您需要为永久性函数执行此操作,该函数将文件名应用于变量。

请记住,我给出的示例只是为了说明在对变量workbook1workbook2worksheet1worksheet2执行任何操作之前需要执行的操作。 您可能希望查看和更改您的代码,以便将来不会出现问题。

也许添加此部分:

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

到每个wb1wb2wb1sheet1sheet2之后调用的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM