AttributeError:'事件'对象没有属性' exl_cols'

时间:2017-12-20 12:38:30

标签: python-3.x tkinter

我使用两个python文件构建Python应用程序,一个用于GUI,另一个用于函数,在GUI文件中我有一个按钮(button1)绑定到第二个文件(browse_file)中的函数,在这个函数我调用另一个函数(exl_cols),但python不接受调用此函数并给我这个错误(事件对象没有属性exl_cols) 任何帮助表示赞赏

GUI

from Browser import Browse
from tkinter import *
import tkinter as tk

class DA(Frame):
    #
    # -------Initiating function-----#
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()
    def create_widgets(self):

        #
        # -------Buttons-------#
        #
        # -------Create browse button-------#
        self.button1 = tk.Button(text="Browse", width=16)
        self.button1.bind("<ButtonRelease-1>", Browse.browse_file)
        self.button1.grid(column=1, row=4, sticky='NEW')

Window = Tk()
Window.title("DA Generator")
Window.geometry("600x250")
DATool = DA(Window)
Window.mainloop()

浏览器

from tkinter import *
from tkinter import filedialog
import tkinter as tk
import pandas as pd
import os


#
# ---------Excel File Browsing---------#
class Browse:

    #
    # -------Browse for input file-----#
    def browse_file(self):
        global i
        global cols
        self.i = tk.StringVar()
        self.filename = filedialog.askopenfile("r")
        self.i.set(self.filename.name)
        self.k = self.filename.name
        self.label3 = tk.Label(text=self.k, bg="White")
        self.label3.grid(column=0, row=4)
        self.direc = os.path.dirname(self.i.get())
        self.db = pd.read_excel(io=self.i.get())
        self.var = tk.StringVar()
        print(list(self.db.columns))
        if list(self.db.columns) is not None:
            print('excel has columns')
            self.cols = (list(self.db.columns))
            self.exl_cols(self.cols)
        return self.i

        #
        # -------Get excel columns-------#

    def exl_cols(self, x ,*args):
        self.x = tk.StringVar()
        print(tuple(x))
        y = tuple(x)
        global varx
        self.varx = tk.StringVar()
        self.varx.set('Excel Columns')
        self.varx.trace("w", self.mapping)
        cols_menu = tk.OptionMenu(Tk(useTk=0).master, self.varx, *y)
        cols_menu.grid(column=1, row=5, sticky='NEW')
        return self.varx

1 个答案:

答案 0 :(得分:0)

您正在将browse_file视为类函数,但它是一个实例的方法。由于绑定总是将事件对象作为绑定函数的第一个参数传递,并且因为Browse.browse_file采用名为self的单个参数,所以self设置为事件对象。当您致电self.exl_cols时,它就像您在事件对象上调用exl_cols一样。因此错误Event object has no attribute exl_cols

换句话说,在您现有的代码self中,由于您调用browse_file的方式而不是您认为的代码。

您需要在调用Browse之前创建browse_file的实例,并且还需要更改browse_file以接受事件对象作为参数:

def browse_file(self, event=None):
    ...

然后,这行代码:

self.button1.bind(..., Browse.browse_file)

......需要这样:

self.button1.bind(..., Browse().browse_file)

注意:在按钮上使用bind通常是错误的。您应该使用command属性(例如:self.button1 = tk.Button(..., command=Browse().browse_file). If you do that, you don't need to support the event argument in browse_file`。