我使用两个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
答案 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`。