2016-08-20 3 views
0

Ich versuche Benutzereingaben von main.py zu nehmen und dann diese Informationen zu verwenden, um eine Ausgabe auf runAnalytics zu erzeugen. Das Problem, auf das ich gestoßen bin, ist, dass die Benutzereingabe manchmal den Wert None (vielleicht null, ich weiß nicht) erzeugt, wenn dividen_yield nicht verfügbar ist und dann mein gesamtes Programm aufhört. Es funktioniert jedoch einwandfrei, wenn es eine Dividendenrendite gibt.Python Tkinter TypeError: 'int' Objekt ist nicht aufrufbar

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() 

[Fehler]

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

Antwort

1

Ich habe versucht, den Code auszuführen, und bekam einen anderen Fehler als Sie bekam:

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 
So

Ich war nicht in der Lage, die Zurückverfolgungs dich zu reproduzieren, aber ich änderte Ihre Label Deklaration in der runAnalytics.py Datei Format Specification Mini-Language gibt Pythons mit (Doppelzeileneinzug für direktes Kopieren und Einfügen des Snippets):

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() 

Dies machte den Code runnable ohne Fehler auf meinem System, da die .format() Anweisung alle Typkonvertierungen auf die gewünschte Zeichenfolge ausgegeben, wenn nötig macht:

GUI working

Beachten Sie, dass es einen kleinen Tippfehler im Text des Label ist, das ich nicht fix hat (CLose sollte Close sein)

+0

Danke so sehr, dass einwandfrei funktioniert. Wenn es Ihnen nichts ausmacht, dass ich frage, warum funktioniert das Hinzufügen von .format? Sorgt etwas dabei anders? – Andrew

+0

Auch habe ich es erneut ausgeführt, aber die Klammern "{}" gelöscht und es ausgeführt, aber nichts erschien. Warum werden die Klammern benötigt? Entschuldigung, ich bin nur neugierig. – Andrew

+1

Die Klammern sind Platzhalter für die Variablen, die in die Zeichenfolge eingefügt werden sollen. Sie können diese Platzhalter auch numerieren oder benennen, was wirklich schön ist, wenn Sie mehr als eine einzelne Variable in eine Zeichenkette überführen, und die Dinge könnten etwas unordentlich werden (schauen Sie sich die Dokumentation an). Leider bin ich mir nicht ganz sicher, wie das Format Mini-Sprache unter der Haube funktioniert. Die formale Spezifikation kann jedoch in [PEP 3101] (https://www.python.org/dev/peps/pep-3101/) gefunden werden. – albert

Verwandte Themen