Ярлык не исчезает в Ткинтере - PullRequest
0 голосов
/ 23 марта 2020

Будучи студентом во времена коронавируса, школы не открыты, и поэтому я должен работать дома, все еще следуя установленному расписанию c. Я сделал виртуальный планировщик, используя tkinter в python, который говорит мне, какой урок я имею, сколько времени у меня осталось (с помощью индикатора выполнения) и какой урок у меня следующий. Вот как это выглядит .

Но когда урок меняется, старый урок все еще остается, а новый просто записывается поверх него. Тогда это выглядит как this. RE (Религиозное образование) написано выше математики.

Код, который я имею, такой:

from tkinter import *
from datetime import datetime, date
from tkinter.ttk import Progressbar
from tkinter import ttk
import math
num = 0

window = Tk()
window.title("Planner")
monday = ['Maths', 'RE', 'Break', 'English', 'Spanish', 'Lunch', 'Music']
tuesday = ['Science', 'History', 'Break', 'Technology', 'Maths', 'Lunch', 'Geography']
wednesday = ['English', 'Games', 'Break', 'Drama', 'Computing', 'Lunch', 'Science']
thursday = ['Art', 'Geography', 'Break', 'Spanish', 'Computing', 'Lunch', 'English']
friday = ['PE', 'History', 'Break', 'Maths', 'Science', 'Lunch', 'English']
timing = [845, 945, 1045, 1100, 1200, 1300, 1350, 1450]

def update():
    global num
    global day
    global time
    now = datetime.now()
    hour = now.strftime("%H")
    minu = now.strftime("%M")
    day = now.strftime("%A")
    time = (hour+minu)
    if int(time) < 1449 and int(time) > 845:

        for i in timing:
            if int(time) < int(timing[num]):
                lesson_time = (timing[num-1])
                break
            num = num + 1
        num = num - 1

        if day == 'Monday':
            text = StringVar()
            label = Label(window, textvariable = text, font=("Arial Bold", 10), fg='darkblue')
            label.grid(row=1, column=0)
            text.set(monday[num])
            if num <= 5:
                next_up = Label(window, text = ("Next: " + monday[num+1]), font=("Arial Bold", 10), fg='darkblue')
                next_up.grid(row=1, column=1)

        elif day == 'Tuesday':
            text = StringVar()
            label = Label(window, textvariable = text, font=("Arial Bold", 10), fg='darkblue')
            label.grid(row=1, column=0)
            text.set(tuesday[num])
            if num <= 5:
                next_up = Label(window, text = ("   Next: "  +  tuesday[num+1] + '     '), font=("Arial Bold", 10), fg='darkblue')
                next_up.grid(row=1, column=1)

        elif day == 'Wednesday':
            text = StringVar()
            label = Label(window, textvariable = text, font=("Arial Bold", 10), fg='darkblue')
            label.grid(row=1, column=0)
            text.set(wednesday[num])
            if num <= 5:
                next_up = Label(window, text = ("Next: " + wednesday[num+1]), font=("Arial Bold", 10), fg='darkblue')
                next_up.grid(row=1, column=1)

        elif day == 'Thursday':
            text = StringVar()
            label = Label(window, textvariable = text, font=("Arial Bold", 10), fg='darkblue')
            label.grid(row=1, column=0)
            text.set(thursday[num])
            if num <= 5:
                next_up = Label(window, text = ("Next: " + thursday[num+1]), font=("Arial Bold", 10), fg='darkblue')
                next_up.grid(row=1, column=1)

        elif day == 'Friday':
            text = StringVar()
            label = Label(window, textvariable = text, font=("Arial Bold", 10), fg='darkblue')
            label.grid(row=1, column=0)
            text.set(friday[num])
            if num <= 5:
                next_up = Label(window, text = ("Next: " + friday[num+1]), font=("Arial Bold", 10), fg='darkblue')
                next_up.grid(row=1, column=1)

        else:
            no_school = Label(window, text = 'Relax - No School!', font=("Arial Bold", 10), fg='darkblue')
            no_school.grid(row=0, column=0)


        if day != 'Saturday' or 'Sunday':
            style = ttk.Style()
            style.theme_use('default')
            style.configure("black.Horizontal.TProgressbar", background='black')
            bar = Progressbar(window, length=100, style='black.Horizontal.TProgressbar', max=60)
            if num == 2:
                target = 15
            elif num == 5:
                target = 50
            else:
                target = 60

            diviser = 60/target
            difference = str(timing[num])[-2:]
            top = (int(timing[num+1])) - int(difference)
            bottom = (int(timing[num])) - int(difference)
            round_time = int(minu) - int(difference)
            if top < 0:
                top = top + 60

            if round_time < 0:
                round_time = round_time + 60
            bar['value'] = (round_time*diviser)
            bar.grid(column=1, row=0)

    else:
        if day == 'Saturday' or day == 'Sunday':
            no_school = Label(window, text = 'Relax - No school!',  font=("Arial Bold", 10), fg='darkblue')
            no_school .grid(row = 0, column = 0)

        else:
            no_school= Label(window, text = 'Relax - No School!',  font=("Arial Bold", 10), fg='darkblue')
            no_school.grid(row = 0, column = 0)


update()
if not day == 'Saturday' or 'Sunday':
    if not (int(time) > 1449) and not (int(time) < 844):
        update = Button(window, text='Update', command=update)
        update.grid(row=0, column = 3)


window.mainloop()

Я пытался label.destroy() раньше изменение текста метки (изменение темы). Это не выдает сообщение об ошибке, но просто не решает проблему.

Кроме того, у меня есть другая проблема. Это то, что я должен вручную нажать «обновить», чтобы он сказал мне последнюю информацию. Есть ли способ его автоматического обновления? Я пытался поместить update() в a для l oop, но это не сработало.

1 Ответ

0 голосов
/ 24 марта 2020

Не следует создавать новые ярлыки в каждом обновлении. Создайте пользовательский интерфейс при запуске программы, затем просто измените текст меток и обновляйте индикатор выполнения при каждом обновлении. Вы можете использовать .after(...) для периодического повторения обновления.

Также следует избегать избыточного кода для каждого дня недели.

Ниже приведен упрощенный код:

import tkinter as tk
from tkinter import ttk
from datetime import datetime

lessons = [
    ['Maths',   'RE',        'Break', 'English',    'Spanish',   'Lunch', 'Music'],     # Monday
    ['Science', 'History',   'Break', 'Technology', 'Maths',     'Lunch', 'Geography'], # Tuesday
    ['English', 'Games',     'Break', 'Drama',      'Computing', 'Lunch', 'Science'],   # Wednesday
    ['Art',     'Geography', 'Break', 'Spanish',    'Computing', 'Lunch', 'English'],   # Thursday
    ['PE',      'History',   'Break', 'Maths',      'Science',   'Lunch', 'English'],   # Friday
]
timing = [845, 945, 1045, 1100, 1200, 1300, 1350, 1450]
total_lessons = len(timing) - 1

def get_lesson(time):
    ''' get time slot of given time (HHMM) '''
    for i in range(len(timing)-1):
        if timing[i] <= time < timing[i+1]:
            return i
    return None

def time_diff(t1, t2):
    ''' calculate difference in minutes between two time (HHMM) '''
    h1, m1 = divmod(t1, 100)
    h2, m2 = divmod(t2, 100)
    h, m = h2-h1, m2-m1
    if m < 0:
        h -= 1
        m += 60
    return h*60 + m

def update():
    now = datetime.now()
    wday = now.weekday()  # get weekday, Monday is 0
    time = now.hour*100 + now.minute # get time in HHMM
    lesson = get_lesson(time)
    if wday in (5, 6) or lesson is None: # Sunday or Saturday or no lesson
        no_school.lift()
    else:
        cur_lesson.config(text=lessons[wday][lesson])
        next_lesson.config(text='Next: '+lessons[wday][lesson+1] if lesson+1 < total_lessons else '')
        # update progressbar
        target = time_diff(timing[lesson], timing[lesson+1]) * 60  # total seconds for current lesson
        seconds = time_diff(timing[lesson], time) * 60 + now.second  # seconds since lesson start
        progress = seconds * 100 // target  # percentage of progress
        progressbar.config(value=progress)
        school.lift()
    window.after(1000, update)  # call update every second


window = tk.Tk()
window.title('Planner')
window.resizable(0, 0)

style = ttk.Style()
style.theme_use('default')

font = ('Arial Bold', 10)
fg = 'darkblue'

# layout for school
school = tk.Frame(window, padx=10, pady=5)
school.grid(row=0, column=0, sticky='nsew')

cur_lesson = tk.Label(school, width=10, font=font, fg=fg, anchor='w')
progressbar = ttk.Progressbar(school, length=100)
next_lesson = tk.Label(school, width=16, font=font, fg=fg, anchor='w')

cur_lesson.grid(row=0, column=0, sticky='ew')
progressbar.grid(row=0, column=1, sticky='ew')
next_lesson.grid(row=1, column=1, sticky='ew')

# layout for no school
no_school = tk.Label(window, text='Relax - No School!', font=font, fg=fg, padx=10, pady=10)
no_school.grid(row=0, column=0, sticky='nsew')

# start update
update()

window.mainloop()
...