首页 > 解决方案 > 用于从 tkinter 中的按钮事件中弹出警报框的异常,无法找出问题的根源

问题描述

所以我的程序使用一行包含 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', 'בחר תיקיית מקור') 

这是来自 CombineExcelFiles 的 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'

由于某种原因,它不断从另一条路径返回

标签: pythonexceptiontkinter

解决方案


解决了它,将所有方法放在对象中,而事件在 init 中运行。

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


推荐阅读