异常用于从tkinter中的按钮事件弹出警报框,无法找到问题的根源

2024-04-29 00:10:59 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的程序用一行excel文件作为一个目录,并将它们合并成一个目录。 gui有两个按钮,一个选择路径,一个保存想要的路径

我创建了一个gui类,我基本上是想在事件发生后将OptionMenu选择的文本向前传递,但是出现了一个异常,我很难处理

长话短说:

import os
from tkinter import *
from tkinter import filedialog
from CombineExcelFiles import *

class GUI:
    def __init__(self, master):
        self.master = master
        master.title('מיזוג קבצי אקסל')
        master.geometry('220x100')

        self.credit = Label(master, text='')
        self.credit.pack()
        self.variable = StringVar(master)
        self.variable.set('חלבי')
        self.opt = OptionMenu(master, self.variable, 'חלבי', 'פרווה')
        self.opt.pack()
        Button(window, text='בחר תיקייה למיזוג', command=upload).pack(side=RIGHT)
        Button(window, text='בחר תייקת הורדה', command=save).pack(side=LEFT)
    def upload():
        global basepath
        basepath = filedialog.askdirectory()

    def save():
        #print(self.variable.get())
        try: #This is line 25
            basepath
            file_list = []
            download_path = filedialog.askdirectory()
            for entry in os.listdir(basepath):
                if os.path.isfile(os.path.join(basepath, entry)):
                    if entry[len(entry)-5:] == '.xlsx' and len(entry) == 17:
                        file_list.append(entry)
            data = getData(basepath, file_list)

            writeToFile(data, file_list, download_path, master.variable.get())
        except NameError:
            tkinter.messagebox.showerror('ERROR', 'בחר תיקיית מקור') 

这是CombineeExcelFiles中的writeToFile:

    def writeToFile(data, files,download_path,variable):
        file = Workbook()
        ws = file.active
        center = Alignment(horizontal='center', vertical='center')
        br = Border(left=Side(style='thin'), 
            right=Side(style='thin'), 
            top=Side(style='thin'), 
            bottom=Side(style='thin'))
                     .
                     .
                     .
        col = 'C'
        row = 3
        count = 0
        for i in data:
            temp = files[count] 
            for j in i[::-1]:
                if type(j) == int or type(j) == float:                
                    ws[col + str(row)].value = ('%.2f' %j)
                    ws[col + str(row)].alignment = center
                    ws[col + str(row)].border = br
                    col = chr(ord(col)+1)                
            ws['J' + str(row)].value = temp[6:8] + '/' + temp[4:6] + '/' + temp[:4]

            ws['K' + str(row)].value = temp[8:10] + ':' + temp[10:12]

            row +=1
            col = 'C'
        ws = fitToCell(ws)
        temp_date = datetime.now()
        file.save(download_path + '/' + 'מעקב ' + variable + str(temp_date.month) + '-' + 
        str(temp_date.year) + '.xlsx' )

给出的错误是:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\******\Anaconda3\lib\tkinter\__init__.py", line 1699, in __call__
  return self.func(*args)
File "C:/Users/******/CombineExcels/mainProject.py", line 25, in save
    print(self.variable.get())
TypeError: writeToFile() missing 1 required positional argument: 'variable'

先谢谢你

编辑,我把代码放在一个文件中,这样它就可以运行了:

import os
from tkinter import *
from tkinter import filedialog
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import Alignment
from openpyxl.styles.borders import Border, Side
from datetime import datetime


class GUI:
    def __init__(self, master):
        self.master = master
        master.title('מיזוג קבצי אקסל')
        master.geometry('220x100')
        self.credit = Label(master, text='')
        self.credit.pack()
        self.variable = StringVar(master)
        self.variable.set('בחר מרשימה')
        self.opt = OptionMenu(master, self.variable, 'חלבי', 'פרווה')
        self.opt.pack()
        Button(window, text='בחר תיקייה למיזוג', command=upload).pack(side=RIGHT)
        Button(window, text='בחר תייקת הורדה', command=save).pack(side=LEFT)
    #START GUI PROPERTIES
    def upload(self):
        global basepath
        basepath = filedialog.askdirectory()
        print(master)
    def save(self):
        file_list = []
        download_path = filedialog.askdirectory()
        for entry in os.listdir(basepath):
            if os.path.isfile(os.path.join(basepath, entry)):
                if entry[len(entry)-5:] == '.xlsx' and len(entry) == 17:
                    file_list.append(entry)
        data = getData(basepath, file_list)
        print(self.variable.get())
        writeToFile(data, file_list, download_path)
    #STOP GUI PROPERTIES  


    def getData(self, basepath, file_list):
        a = []
        for file in file_list:
            load_workbook(basepath + '/' + file)
            tempData = []
            for cell in temp['Sheet1']:
                for value in cell:
                    if value.value == None:
                        continue
                    else:
                        tempData.append(value.value)
                    data.append(tempData)
            return data
    def fitToCell(self, ws): #get used columns and than fit cell's width into length of letters
        dict = {}
        for cell in ws:
            for value in cell:
                temp = str(value.value)
                if temp:
                    if value.coordinate[0] not in dict:
                        dict[value.coordinate[0]] = len(temp)
                    elif len(temp) > dict[value.coordinate[0]]:
                        dict[value.coordinate[0]] = len(temp)
        for col in dict:
            ws.column_dimensions[col].width = dict[col] 
        return ws
    def writeToFile(self, data, files,download_path):
        file = Workbook()
        ws = file.active
        center = Alignment(horizontal='center', vertical='center')
        br = Border(left=Side(style='thin'), 
                right=Side(style='thin'), 
                top=Side(style='thin'), 
                bottom=Side(style='thin'))
        print(ws.evenHeader.right.text)
        if self.variable.get() == 'חלבי':
            ws['C2'].value = 'חלב רצוי'
            ws['C2'].alignment = center
            ws['C2'].border = br
            ws['D2'].value = 'חלב מצוי'
            ws['D2'].alignment = center
            ws['D2'].border = br
        ws['E2'].value = 'קקאו רצוי'
        ws['E2'].alignment = center
        ws['E2'].border = br
        ws['F2'].value = 'קקאו מצוי'
        ws['F2'].alignment = center
        ws['F2'].border = br
        ws['G2'].value = 'שמן רצוי'
        ws['G2'].alignment = center
        ws['G2'].border = br
        ws['H2'].value = 'שמן מצוי'
        ws['H2'].alignment = center
        ws['H2'].border = br
        ws['I2'].value = 'סוכר רצוי'
        ws['I2'].alignment = center
        ws['I2'].border = br
        ws['J2'].value = 'סוכר מצוי'
        ws['J2'].alignment = center
        ws['J2'].border = br
        ws['I2'].value = 'מספר מתכון'
        ws['I2'].alignment = center
        ws['I2'].border = br
        ws['J2'].value = 'זמן ייצור'
        ws['J2'].alignment = center
        ws['J2'].border = br
        ws['K2'].value = 'תאריך ייצור'
        ws['K2'].alignment = center
        ws['K2'].border = br
        col = 'C'
        row = 3
        count = 0
        for i in data:
            temp = files[count] 
            for j in i[::-1]:
                if type(j) == int or type(j) == float:                
                    ws[col + str(row)].value = ('%.2f' %j)
                    ws[col + str(row)].alignment = center
                    ws[col + str(row)].border = br
                    col = chr(ord(col)+1)                
            ws['J' + str(row)].value = temp[6:8] + '/' + temp[4:6] + '/' + temp[:4]
            ws['J' + str(row)].alignment = center
            ws['J' + str(row)].border = br
            ws['K' + str(row)].value = temp[8:10] + ':' + temp[10:12]
            ws['K' + str(row)].border = br
            ws['K' + str(row)].alignment = center
            row +=1
            col = 'C'
        ws = fitToCell(ws)
        temp_date = datetime.now()
        file.save(download_path + '/' + 'מעקב ' + self.variable.get() +' ' + str(temp_date.month) + '-' + str(temp_date.year) + '.xlsx' )




window = Tk()
my_gui = GUI(window)
#print(my_gui.variable.get())
window.mainloop()

这是错误:

runfile('C:/Users/*****/Desktop/תכנות/untitled2.py', 
wdir='C:/Users/*****/Desktop/תכנות')
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\*****\Anaconda3\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:/Users/*****/CombineExcels/mainProject.py", line 25, in save
TypeError: writeToFile() missing 1 required positional argument: 'var'

出于某种原因,它总是从另一条路返回


Tags: inbrselfmasterwsvaluecolvariable
1条回答
网友
1楼 · 发布于 2024-04-29 00:10:59

解决了这个问题,把所有的方法放在对象中,而events func放在init中

我也运行了太多次程序,所以错误与我的代码无关

相关问题 更多 >