#python #tkinter
#питон #tkinter
Вопрос:
Я продолжаю получать сообщение об ошибке «данные ‘startdate_info’ не соответствуют формату ‘%Y-%m-%d'», но он не открывает графический интерфейс для ввода данных. Он должен открыть графический интерфейс для даты начала, даты окончания, тикера и проверки ввода строки. Эти строки должны входить в:
newtime = yf.download('ticker_info', start = 'startdate_info', end = 'enddate_info')
Но по какой-то причине я продолжаю застревать на этой строке 55.
import yfinance as yf
import pandas as pd
import pyautogui
from tkinter import *
import keyboard
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
screen = Tk()
screen.geometry("450x550")
startdate = StringVar()
start_date = Label(text = "Enter start date in YYYY-MM-DD format: ")
start_date.place(x = 15, y = 70)
startdate_entry = Entry(textvariable = startdate, width = "30")
startdate_entry.place(x = 15, y = 120)
enddate = StringVar()
end_date = Label(text = "Enter end date in YYYY-MM-DD format: ")
end_date.place(x = 15, y = 170)
enddate_entry = Entry(textvariable = enddate, width = "30")
enddate_entry.place(x = 15, y = 220)
tickerE = StringVar()
ticker_label = Label(text = "Ticker symbol: ")
ticker_label.place(x = 15, y = 270)
ticker = Entry(textvariable = tickerE, width = "30")
ticker.place(x = 15, y = 320)
inspectE = StringVar()
inspect_label = Label(text = "What would you like to analyze ")
inspect_label.place(x = 15, y = 270)
inspect_label = Label(text = "(Open, High, Low, Close, Adj Close, Volume)? ")
inspect_label.place(x = 15, y = 320)
inspect = Entry(textvariable = inspectE, width = "30")
inspect.place(x = 15, y = 370)
def save_info():
startdate_info = startdate.get()
enddate_info = enddate.get()
ticker_info = tickerE.get()
inspect_info = inspectE.get()
return ticker_info, inspect_info, startdate_info, enddate_info
save_info()
search = Button(screen,text = "Search", width = "30", height = "2", command = save_info, bg = "grey")
search.place(x = 14, y = 410)
ticker_info, inspect_info, startdate_info, enddate_info = save_info()
newtime = yf.download('ticker_info', start = 'startdate_info', end = 'enddate_info')
print(newtime)
def adjusted_close(ticker_info, newtime):
newtime[inspect_info].plot()
plt.xlabel("Date")
plt.ylabel(inspect_info)
plt.title(ticker_info " " inspect_info " " "Data")
plt.show()
adjusted_close(ticker_info, newtime)
Ответ №1:
Вы передали строки в yf.download()
:
newtime = yf.download('ticker_info', start = 'startdate_info', end = 'enddate_info')
Вы должны передать переменные:
newtime = yf.download(ticker_info, start=startdate_info, end=enddate_info)
Кроме того, вы не должны выполнять функцию сразу после создания Entry
виджетов, потому что пока ничего не вводится. Вы должны выполнить функцию внутри save_info()
:
def save_info():
startdate_info = startdate.get()
enddate_info = enddate.get()
ticker_info = tickerE.get()
inspect_info = inspectE.get()
print(startdate_info, enddate_info, ticker_info, inspect_info, sep=",")
newtime = yf.download(ticker_info, start=startdate_info, end=enddate_info)
print(newtime)
Ниже приведен сокращенный пример, основанный на вашем коде:
from tkinter import *
import yfinance as yf
import matplotlib.pyplot as plt
screen = Tk()
screen.geometry("450x580")
startdate = StringVar()
start_date = Label(text="Enter start date in YYYY-MM-DD format:")
start_date.place(x=15, y=70)
startdate_entry = Entry(textvariable=startdate, width=30)
startdate_entry.place(x=15, y=120)
enddate = StringVar()
end_date = Label(text="Enter end date in YYYY-MM-DD format:")
end_date.place(x=15, y=170)
enddate_entry = Entry(textvariable=enddate, width=30)
enddate_entry.place(x=15, y=220)
tickerE = StringVar()
ticker_label = Label(text="Ticker symbol:")
ticker_label.place(x=15, y=270)
ticker = Entry(textvariable=tickerE, width=30)
ticker.place(x=15, y=320)
inspectE = StringVar()
inspect_label = Label(text="What would you like to analyze")
inspect_label.place(x=15, y=370)
inspect_label = Label(text="(Open, High, Low, Close, Adj Close, Volume)?")
inspect_label.place(x=15, y=420)
inspect = Entry(textvariable=inspectE, width=30)
inspect.place(x=15, y=470)
def save_info():
startdate_info = startdate.get()
enddate_info = enddate.get()
ticker_info = tickerE.get()
inspect_info = inspectE.get()
print(startdate_info, enddate_info, ticker_info, sep=",")
newtime = yf.download(ticker_info, start=startdate_info, end=enddate_info)
print(newtime)
# plot it
newtime[inspect_info].plot()
plt.xlabel("Date")
plt.ylabel(inspect_info)
plt.title(f"{ticker_info} {inspect_info} Data")
plt.show()
search = Button(screen, text="Search", width="30", height="2", command=save_info, bg="grey")
search.place(x=14, y=510)
screen.mainloop()
Комментарии:
1. Я все еще получаю ошибку. «Нет объектов для объединения», но графический интерфейс никогда не открывается. Графический интерфейс должен открываться и запрашивать пользователя для этих полей.
2. Это потому
ticker
, что запись накладывается наinspect_label
(оба помещаются в (15 270)), поэтому вы не можете вводитьticker
, и это приводитtikcer_info
к пустоте.3. Даже если они не находятся в одном и том же месте, он не откроет графический интерфейс. Я внес предложенные вами изменения и по-прежнему не имею объектов для объединения — я не могу ввести объекты, потому что графический интерфейс не открывается.
4. Я добавил сокращенный пример, который работает для меня. Поэтому, если графический интерфейс не открывается в вашем случае, проблемы возникают где-то еще.
5. Хорошо, теперь откроется графический интерфейс. Когда я ввожу временной диапазон и символ тикера, я получаю нужные мне данные в консоли. Но как мне заставить его запускать функцию нижнего графика после нажатия кнопки?