2016-08-20 4 views
0

사용자 입력을 main.py에서 가져 와서 해당 정보를 사용하여 runAnalytics에서 출력을 생성하려고합니다. 내가 겪고있는 문제는 때로는 사용자 입력이 None (어쩌면 null, 나도 몰라) 값을 생성하고 dividen_yield를 사용할 수 없을 때 전체 프로그램이 멈추는 경우입니다. 그것은 배당 수익률이있을 때 완벽하게 작동합니다.Python Tkinter TypeError : 'int'객체를 호출 할 수 없습니다.

main.py

import runAnalytics 
from tkinter import * 
import os 
import centerWindow 

loadApplication = Tk() 
loadApplication.title("Stock Analytics") 
loadApplication.geometry("1080x720") 

label1 = Label(loadApplication, text = "Ticker") 
input1 = Entry(loadApplication) 

loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) 

centerWindow.center(loadApplication) 


label1.pack() 
input1.pack() 
loadAnalytics.pack() 

loadApplication.mainloop() 

runAnalytics.py

from yahoo_finance import Share 
from tkinter import * 
import os 
import centerWindow 

def run(input1): 
    ticker = Share(input1.get()) 
    loadAnalytics = Tk() 
    loadAnalytics.title("$" + "ticker" + "Data") 
    loadAnalytics.geometry("1080x720") 
    centerWindow.center(loadAnalytics) 

    ticker.refresh() 

    if ticker.get_dividend_yield() is None: 
     ticker.get_dividend_yield == 0 

    share_price = Label(loadAnalytics, text = "Share Price: " + ticker.get_price()).pack() 
    prev_open  = Label(loadAnalytics, text = "Previous Open: " + ticker.get_open()).pack() 
    prev_close  = Label(loadAnalytics, text = "Previous CLose: " + ticker.get_prev_close()).pack() 
    dividend_yield = Label(loadAnalytics, text = "Dividend Yield: " + ticker.get_dividend_yield()).pack() 
    year_low  = Label(loadAnalytics, text = "52 Week Low: " + ticker.get_year_low()).pack() 
    year_high  = Label(loadAnalytics, text = "52 Week High: " + ticker.get_year_high()).pack() 
    volume   = Label(loadAnalytics, text = "Volume: " + ticker.get_volume()).pack() 

    loadAnalytics.mainloop() 

[오류]

Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\MyName\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py", line 1550, in call return self.func(*args) File "C:\Users\MyName\Documents\Python Projects\DataAnalytics\main.py", line 13, in loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) File "C:\Users\MyName\Documents\Python Projects\DataAnalytics\runAnalytics.py", line 21, in run dividend_yield = Label(loadAnalytics, text = "Dividend Yield: " + ticker.get_dividend_yield()).pack() TypeError: 'int' object is not callable

답변

1

나는 코드를 실행하려고하고있어보다 다른 오류가 발생했습니다 :

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "./main.py", line 15, in <lambda> 
    loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) 
    File "/Users/Sven/temp/stackexchange/python/runAnalytics.py", line 22, in run 
    dividend_yield = Label(loadAnalytics, text = "Dividend Yield: " + ticker.get_dividend_yield()).pack() 
TypeError: Can't convert 'NoneType' object to str implicitly 

그래서 나는 당신이있어 역 추적을 재현 할 수 없습니다,하지만 난 파이썬의 Format Specification Mini-Language주는 (스 니펫 직접 복사 및 붙여 넣기를위한 더블 라인 들여 쓰기)를 사용하여 runAnalytics.py 파일에 Label 선언을 변경 :

share_price = Label(loadAnalytics,text='Share Price: {}'.format(ticker.get_price())).pack() 
    prev_open  = Label(loadAnalytics,text='Previous Open: {}'.format(ticker.get_open())).pack() 
    prev_close  = Label(loadAnalytics,text='Previous CLose: {}'.format(ticker.get_prev_close())).pack() 
    dividend_yield = Label(loadAnalytics,text='Dividend Yield: {}'.format(ticker.get_dividend_yield())).pack() 
    year_low  = Label(loadAnalytics,text='52 Week Low: {}'.format(ticker.get_year_low())).pack() 
    year_high  = Label(loadAnalytics,text='52 Week High: {}'.format(ticker.get_year_high())).pack() 
    volume   = Label(loadAnalytics,text='Volume: {}'.format(ticker.get_volume())).pack() 

GUI working

:

이것은 .format() 문이 원하는 문자열 출력에 대한 모든 형식 변환 필요한 경우 않기 때문에 내 시스템에 어떤 오류없이 실행 가능한 코드를 만들어내가 해결되지 않은 레이블의 텍스트에있는 작은 오타가 있다는 것을

+0

가 완벽하게 작동하는, 정말 감사합니다 (CLoseClose해야한다). 내가 묻는 것에 신경 쓰지 않는다면 .format을 추가하는 것이 왜 효과가 있었습니까? 그렇게함으로써 뭔가 다르게 컴파일되고 있습니까? – Andrew

+0

또한 다시 실행했지만 대괄호 "{}"을 삭제하고 실행했지만 아무 것도 나타나지 않았습니다. 괄호가 필요한 이유는 무엇입니까? 미안, 나는 단지 호기심이 많다. – Andrew

+1

대괄호는 문자열에 채울 변수에 대한 자리 표시 자입니다. 또한 문자열에 하나 이상의 변수를 전달할 때 물건을 조금 더러워 지거나 (문서를 살펴보십시오) 정말 좋은 자리 표시자를 수치화하거나 이름을 지정할 수 있습니다. 불행히도, 형식 미니 언어가 두포에서 어떻게 작동하는지 완전히 모르겠습니다. 그러나 공식 사양은 [PEP 3101] (https://www.python.org/dev/peps/pep-3101/)에서 찾을 수 있습니다. – albert

관련 문제