Графический интерфейс не открывается для строки ввода

#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. Хорошо, теперь откроется графический интерфейс. Когда я ввожу временной диапазон и символ тикера, я получаю нужные мне данные в консоли. Но как мне заставить его запускать функцию нижнего графика после нажатия кнопки?