Могу ли я оставить окно tkinter открытым при использовании сохраненных переменных? - PullRequest
0 голосов
/ 03 мая 2020

В записной книжке Jupyter я использую tkinter для сбора пользовательского ввода, чтобы другой код мог генерировать выходной файл. Я создал кнопку отправки для хранения переменных, но я должен закрыть окно tkinter, прежде чем остальная часть кода сможет использовать их и запустить для вывода.

Я хотел бы иметь возможность выполнить весь путь до выходного файла, а затем ввести новые входы без закрытия и перезапуска. Как я могу держать окно tkinter открытым все время?


from tkinter import *
import datetime
from datetime import timedelta
from dateutil.relativedelta import relativedelta
import pandas as pd

class MyWindow:
    def __init__(self, win):
        self.lbl=Label(win, text="Tool")
        self.lbl1=Label(win, text='ndays')
        self.lbl2=Label(win, text='Date 1')

        self.t1=Entry()
        self.t2=Entry()

        self.lbl.place(x=150, y=10)

        self.lbl1.place(x=50, y=50)
        self.t1.place(x=150, y=50)

        self.lbl2.place(x=50, y=90)
        self.t2.place(x=150, y=90)    
        self.b1=Button(win, text='Submit', command=self.submit)

        self.b2=Button(win, text='Refresh')
        self.b2.bind('<Button-1>', self.refresh)

        self.b1.place(x=150, y=260)
        self.b2.place(x=270, y=260)

    def submit(self):
        global ndays, screen

        ndays=self.t1.get()
        screen=self.t2.get()

    #in case of refresh
    def refresh(self, event):
        self.t1.delete(0, 'end')
        self.t2.delete(0, 'end')

window=Tk()
mywin=MyWindow(window)
window.title("Tool")
window.geometry("400x400+10+10")
window.mainloop()

Я не могу получить доступ к переменным имени и даты на экране без выхода из окна tkinter. Я хотел бы иметь возможность переопределить sh переменных и снова запустить их для вывода без необходимости закрывать окно.

Код ниже - это следующие шаги, которые я буду выполнять для создания пользовательского календарь.


screen = datetime.datetime.strptime(screen, '%m/%d/%y').date()

# find the of the number of days backwards.
ndays=int(ndays)
thirty_back = screen + relativedelta(days=-ndays - 1)

delta1 = screen - thirty_back

# Empty lists to loop into
date_list = []  # dates
day_counter_thing = []
day_o_week = []  # real day of week
counter = []  # list for the days used

day_count = -1  # starts at -1 so that screen day can be 0

for i in range(delta1.days):
    day = screen - timedelta(days=i)  # know where to start the tlfb

    date_list.append(day)  # list of dates in the loop
    day_count = day_count + 1  # add a count for each day in the loop
    counter.append(day_count)  # keep a list of all the day counts

    day_o_week.append(day.strftime("%A"))  # add the real day of the week
    name = day.weekday()  # name of day by index of day in week
    day_counter_thing.append(name)  # keep the list
max_day = max(counter)  # gives you reference so that you can swap the counter after screen

# put the values from the loops into a dataframe
df = pd.DataFrame({'Date': date_list, "Day": day_o_week, "Counter": day_counter_thing, "TLFB_Day": counter})

1 Ответ

0 голосов
/ 05 мая 2020

Этот код распечатывает фрейм данных в терминале после нажатия кнопки «Отправить» в окне. Пока окно не закрыто, mainl oop будет работать, и никакой другой код будет невозможно запустить.

from tkinter import *
import datetime
from datetime import timedelta
from dateutil.relativedelta import relativedelta
import pandas as pd

class MyWindow:
    def __init__(self, win):
        self.lbl=Label(win, text="Tool")
        self.lbl1=Label(win, text='ndays')
        self.lbl2=Label(win, text='Date 1')

        self.t1=Entry()
        self.t2=Entry()

        self.lbl.place(x=150, y=10)

        self.lbl1.place(x=50, y=50)
        self.t1.place(x=150, y=50)

        self.lbl2.place(x=50, y=90)
        self.t2.place(x=150, y=90)    
        self.b1=Button(win, text='Submit', command=self.submit)

        self.b2=Button(win, text='Refresh')
        self.b2.bind('<Button-1>', self.refresh)

        self.b1.place(x=150, y=260)
        self.b2.place(x=270, y=260)

    def calendar( self, screen, ndays ):
        # find the of the number of days backwards.

        screen = datetime.datetime.strptime(screen, '%m/%d/%y').date()
        ndays=int(ndays)
        thirty_back = screen + relativedelta(days=-ndays - 1)

        delta1 = screen - thirty_back

        # Empty lists to loop into
        date_list = []  # dates
        day_counter_thing = []
        day_o_week = []  # real day of week
        counter = []  # list for the days used

        day_count = -1  # starts at -1 so that screen day can be 0

        for i in range(delta1.days):
            day = screen - timedelta(days=i)  # know where to start the tlfb

            date_list.append(day)  # list of dates in the loop
            day_count = day_count + 1  # add a count for each day in the loop
            counter.append(day_count)  # keep a list of all the day counts

            day_o_week.append(day.strftime("%A"))  # add the real day of the week
            name = day.weekday()  # name of day by index of day in week
            day_counter_thing.append(name)  # keep the list
        max_day = max(counter)  # gives you reference so that you can swap the counter after screen

        # put the values from the loops into a dataframe
        return pd.DataFrame({'Date': date_list, "Day": day_o_week, "Counter": day_counter_thing, "TLFB_Day": counter})

    def submit(self):
        print( self.calendar( self.t2.get(), self.t1.get()) )

    #in case of refresh
    def refresh(self, event):
        self.t1.delete(0, 'end')
        self.t2.delete(0, 'end')

window=Tk()
mywin=MyWindow(window)
window.title("Tool")
window.geometry("400x400+10+10")
window.mainloop()

Альтернативой может быть показ результатов в самом окне, вместо их печати в текстовом объекте или серии меток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...