Попытка свидания в Tkinter - Python - PullRequest
0 голосов
/ 30 октября 2018

После многократного тестирования и чтения Stackoverflow в течение нескольких часов я решил исправить этот вопрос. Мой текст (часть большего кода) ниже:

import pandas as pd
import datetime as dt
from tkinter import *
import tkinter.filedialog
from tkinter import messagebox


def test_click():
  global ipt_dt   
  global coef
  global z
  global w
  z = item_prosp['Accrual_Start'].min()
  w = item_prosp['Accrual_End'].max()
  ipt_d = tkvar_d.get()
  ipt_m = tkvar_m.get()
  ipt_y = tkvar_y.get()  
  x = 0
  while x == 0:
    ipt = str(ipt_d + '/'+ ipt_m + '/' + ipt_y)
    try:
        ipt_dt = dt.datetime.strptime(ipt, "%d/%b/%Y")
        if ipt_dt < z or ipt_dt > w:
                messagebox.showinfo("Error", "The input date is outside scope date") 
    else:
         print("Date ok")
        x =+ 1
    except: 
        messagebox.showerror("Error", "The input date is not valid")
        ipt_d = 0
        ipt_m = 0
        ipt_y = 0
        continue

И секция tkinter кода, который генерирует входные данные:

 #Question 1 - Evaluation date
 label4 = Label(window, text='Please inform the valuation date :', bg='white').grid(row=13, column=0, columnspan=3, pady=2, sticky=W)
 tkvar_d = StringVar(window)
 tkvar_m = StringVar(window)
 tkvar_y = StringVar(window)
 choices_d = ['1', '2', '3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
 choices_m = ['Jan', 'Feb', 'Mar','Apr','May','Jun','Jul','Aug','Sep','Oct', 'Nov', 'Dec']
 choices_y = ['2018','2019', '2020', '2021','2022','2023','2024','2025','2026','2027','2028','2029','2030']
 popupmenu_d = OptionMenu(window, tkvar_d, *choices_d)
 popupmenu_m = OptionMenu(window, tkvar_m, *choices_m)
 popupmenu_y = OptionMenu(window, tkvar_y, *choices_y)
 label5 = Label(window, text='Day :', bg='white').grid(row=14, column=0, sticky=E+W)
 popupmenu_d.grid(row=15, column=0, padx=2, sticky=E+W)
 label6 = Label(window, text='Month :', bg='white').grid(row=14, column=1, sticky=E+W)
 popupmenu_m.grid(row=15, column=1, padx=2, sticky=E+W)
 label7 = Label(window, text='Year :', bg='white').grid(row=14, column=2, sticky=E+W)
 popupmenu_y.grid(row=15, column=2, padx=2, sticky=E+W)
 Button(window, text="Test Date", width=10, command=test_click).grid(row=15, column=3, padx=5, pady=10, sticky=W)

Пример значения W при запуске файла:

2018-04-18 00:00:00

и для Z:

2018-04-18 00:00:00

Мне нужно импортировать файл (построенный извне и уже структурированный), прочитать 2 значения из него (переменные Z и W в коде) и сравнить его с входной переменной (ipt_dt), которая является датой, заполненной пользователь через 3 выпадающих меню от tkinter.

Ошибка в том, что попытка не проходит через оператор if, и она никогда не печатает, если входные данные выходят за пределы области действия. Каждый раз, когда я ввожу дату, меньшую, чем минимальная дата или превышающая максимальную, она возвращает сообщение о душе, даже если оно печатает «Дата в порядке».

Кто-нибудь имеет представление о том, как решить эту проблему или почему мой файл игнорируется?

Спасибо!

1 Ответ

0 голосов
/ 30 октября 2018

Я посмотрел ваш изначально опубликованный код, и вы загружаете Excel в df с помощью функции load_click. Но на самом деле вы нигде не запускаете функцию load_click, поэтому информационный фрейм не загружается и поэтому z и w не заполнены.

Если вы измените функцию click1 () следующим образом, то она должна работать (у меня это было с некоторыми примерами данных).

def click1():
  global a
  a = tkinter.filedialog.askopenfilename(initialdir = "/",title = "Select file", filetypes = ( ("Excel file", "*.xlsx"), ("All files", "*.*") ) )
  output1.insert(END, a)
  global a1
  a1 = output1.get() 
  load_click()

Или добавьте отдельную кнопку загрузки, если хотите (внизу части # File1):

Button(window, text="Load", width=6, command=load_click).grid(row=4, column=3, padx=5, sticky=W)

Вы можете также добавить еще один x = 1 в оператор if. В противном случае окно сообщения будет продолжать появляться из-за цикла while, что делает невозможным исправление введенной даты.

x = 0
while x == 0:
    ipt = str(ipt_d + '/'+ ipt_m + '/' + ipt_y)
    try:
        ipt_dt = dt.datetime.strptime(ipt, "%d/%b/%Y")
        print type(ipt_dt)
        if (ipt_dt < z) or (ipt_dt > w):
            messagebox.showinfo("Error", "The input date is outside scope date")
            x = 1 # I've added this one
        else:
            print("Date ok")
            x =+ 1
    except: 
        messagebox.showerror("Error", "The input date is not valid")
        ipt_d = 0
        ipt_m = 0
        ipt_y = 0
    continue 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...