2017-12-20 12 views
0

GUI 파일과 GUI 파일에 두 개의 파이썬 파일 (하나는 GUI 용이고 다른 하나는 함수 용)을 사용하여 Python 응용 프로그램을 작성하고 있습니다. 두 번째 파일 (browse_file)의 함수는 다른 함수 (exl_cols)를 호출하지만 python은이 함수를 호출하는 것을 허용하지 않고이 오류를 제공합니다 (이벤트 객체에는 exl_cols 속성이 없습니다) AttributeError : '이벤트'객체에 '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

browse_file은 클래스 기능인 것처럼 처리되지만 인스턴스의 메소드입니다. 바인딩은 항상 바인딩 된 함수의 첫 번째 매개 변수로 이벤트 객체를 전달하므로 Browse.browse_fileself이라는 단일 인수를 사용하기 때문에 self이 이벤트 객체로 설정됩니다. self.exl_cols으로 전화하면 이벤트 개체에서 exl_cols을 호출 한 것과 같습니다. 따라서 오류 Event object has no attribute exl_cols

즉, 기존 코드 self은 사용자가 browse_file으로 전화하는 방식 때문에 생각한 것이 아닙니다.

당신은 browse_file를 호출하기 전에 Browse의 인스턴스를 생성해야하고, 당신은 또한 매개 변수로 이벤트 객체 받아 browse_file을 변경해야 다음

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

코드 행 :

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

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

...이 할 필요가

참고 : 버튼에 bind을 사용하는 것이 일반적으로 잘못되었습니다. 대신 command 속성을 사용해야합니다 (예 :. 나는 self.exl_cols의 라인을 Button1을 누를 때 나는 Browse.browse_file에 Button1을 바인딩에 문제가없는 argument in browse_file`

+0

self.button1 = tk.Button(..., command=Browse().browse_file). If you do that, you don't need to support the 이벤트, 그것은 일반적으로 실행 (self.cols) 실행되지 않은 browse_file 함수 아래에있는 이벤트 개체의 오류를 제공합니다. exl_cols – MEL46

+0

@ MEL46 : 예, 인스턴스를 만들지 않으므로 오류가 발생합니다.이 함수의 첫 번째 인수는 'self '이므로 바인딩이 함수를 호출 할 때 이벤트는'self'로 전달되므로'Event 객체에는 속성이 없습니다. exl_cols' –

+0

@ MEL46 : 답변을 업데이트했습니다. –