Как заменить значение лейбла в модуле Tkinter?

veDO

Новичок
Пользователь
Май 15, 2020
12
4
3
Вот код,
Python:
from tkinter import *
import time
import pyglet
song = pyglet.media.load('C:/Users/Public/Music/bud.mp3')
   
root = Tk()
root.resizable( width = False, height = False )
root.geometry('320x150')
root.title('TIMER BY VEDO')
root ['bg'] = 'white'
root.iconbitmap ('clock.ico')
text_time = Label(text = 'Через сколько?(в мин, с, ч)', font = 'Consolas 12',
fg = '#3d3d42',
bg = '#ccc')
test = Entry(root, font = 'Consolas 12',relief = 'raised')
enter = Button (text = 'Начать',relief = 'raised', font = 'TimesNewRoman 12')
soundyes = Checkbutton(text = 'Не проигрывать звук по истечению времени?', font = 'Consolas 9', bg = 'white', onvalue=False, offvalue=True)
oscar = Label(text = 'Осталось 0с', font = 'Consolas 15', bg = 'white', fg = 'white')
text_time.pack()
test.pack()
soundyes.pack()
enter.pack()
oscar.pack()
def timerstart (event):
    try:
        timer = test.get()
        check = timer.replace('с',' с').replace('мин', ' мин').replace('ч', ' ч').replace('c', ' с').split()
        num = int(check[0])
        draft = check[1]
        if draft == 'ч':
            time2 = num*3600
        elif draft == 'мин':
            time2 = num*60
        elif draft == 'с':
            time2 = num
        time2 = int(time2)
        while time2 > 0:
            print ('Осталось '+str(time2)+'с')
            oscar = Label(text = 'Осталось '+str(time2)+'с', font = 'Consolas 15', bg = 'black', fg = 'white')
            time2 -= 1
            time.sleep(1)
        print ('Время вышло!')
        song.play()
    except:
        print('Ошибка!')

enter.bind('<Button-1>', timerstart)

root.mainloop()
Хочу что бы oscar = Label(text = 'Осталось '+str(time2)+'с', font = 'Consolas 15', bg = 'black', fg = 'white'), заменяло значение лейбла которое задано изначально. Но во первых ничего не изменяется, а во вторых во время цикла while само окно зависает. По возможности хочу убрать все остальное, кроме остатка из диалогового окна. Заранее спасибо.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Немного переделал ваш код:
Python:
from tkinter import *
import time
import pyglet
import threading


# плеер
player = pyglet.media.Player()

root = Tk()
root.resizable(width=False, height=False)
root.geometry('320x150')
root.title('TIMER BY VEDO')
root['bg'] = 'white'
root.iconbitmap('clock.ico')
text_time = Label(text='Через сколько?(в мин, с, ч)',
                  font='Consolas 12',
                  fg='#3d3d42',
                  bg='#ccc')
test = Entry(root, font='Consolas 12', relief='raised')
enter = Button(text='Начать', relief='raised', font='TimesNewRoman 12')

# переменная для чекбокса
check = IntVar()
# привязка переменной к чекбоксу: variable=check
soundyes = Checkbutton(text='Не проигрывать звук по истечению времени?',
                       font='Consolas 9', bg='white', variable=check)

oscar = Label(text='Осталось 0с', font='Consolas 15', bg='white', fg='white')
text_time.pack()
test.pack()
soundyes.pack()
enter.pack()
oscar.pack()


# таймер
def timer(time2):
    while time2 > 0:
            print('Осталось ' + str(time2 - 1) + 'с')
            # изменение текста и фона лейбла
            oscar.config(text='Осталось ' + str(time2 - 1) + 'с', bg='black')
            time2 -= 1
            time.sleep(1)
    
    # скрываем лейбл
    oscar.config(bg='white')
    player.volume = 0.5  # громкость от 0 до 1
    # загружаем файл здесь чтобы можно было запускать таймер несколько раз
    # без перезапуска программы
    song = pyglet.media.load('C:/Users/Public/Music/bud.mp3')
    # добавляем в плейлист
    player.queue(song)
    # если не выбран чекбокс
    if not check.get():
        # проигрываем
        player.play()


def timerstart(event):
    try:
        timer = test.get()
        check = timer.replace('с',' с').replace('мин', ' мин').replace('ч', ' ч').replace('c', ' с').split()
        num = int(check[0])
        draft = check[1]
        if draft == 'ч':
            time2 = num * 3600
        elif draft == 'мин':
            time2 = num * 60
        elif draft == 'с':
            time2 = num
        time2 = int(time2)
        # запуск таймера в отдельном потоке
        threading.Thread(target=timer, args=[time2]).start()
    except:
        print('Ошибка!')


enter.bind('<Button-1>', timerstart)
root.mainloop()
 
  • Мне нравится
Реакции: veDO

veDO

Новичок
Пользователь
Май 15, 2020
12
4
3
Немного переделал ваш код:
Python:
from tkinter import *
import time
import pyglet
import threading


# плеер
player = pyglet.media.Player()

root = Tk()
root.resizable(width=False, height=False)
root.geometry('320x150')
root.title('TIMER BY VEDO')
root['bg'] = 'white'
root.iconbitmap('clock.ico')
text_time = Label(text='Через сколько?(в мин, с, ч)',
                  font='Consolas 12',
                  fg='#3d3d42',
                  bg='#ccc')
test = Entry(root, font='Consolas 12', relief='raised')
enter = Button(text='Начать', relief='raised', font='TimesNewRoman 12')

# переменная для чекбокса
check = IntVar()
# привязка переменной к чекбоксу: variable=check
soundyes = Checkbutton(text='Не проигрывать звук по истечению времени?',
                       font='Consolas 9', bg='white', variable=check)

oscar = Label(text='Осталось 0с', font='Consolas 15', bg='white', fg='white')
text_time.pack()
test.pack()
soundyes.pack()
enter.pack()
oscar.pack()


# таймер
def timer(time2):
    while time2 > 0:
            print('Осталось ' + str(time2 - 1) + 'с')
            # изменение текста и фона лейбла
            oscar.config(text='Осталось ' + str(time2 - 1) + 'с', bg='black')
            time2 -= 1
            time.sleep(1)
   
    # скрываем лейбл
    oscar.config(bg='white')
    player.volume = 0.5  # громкость от 0 до 1
    # загружаем файл здесь чтобы можно было запускать таймер несколько раз
    # без перезапуска программы
    song = pyglet.media.load('C:/Users/Public/Music/bud.mp3')
    # добавляем в плейлист
    player.queue(song)
    # если не выбран чекбокс
    if not check.get():
        # проигрываем
        player.play()


def timerstart(event):
    try:
        timer = test.get()
        check = timer.replace('с',' с').replace('мин', ' мин').replace('ч', ' ч').replace('c', ' с').split()
        num = int(check[0])
        draft = check[1]
        if draft == 'ч':
            time2 = num * 3600
        elif draft == 'мин':
            time2 = num * 60
        elif draft == 'с':
            time2 = num
        time2 = int(time2)
        # запуск таймера в отдельном потоке
        threading.Thread(target=timer, args=[time2]).start()
    except:
        print('Ошибка!')


enter.bind('<Button-1>', timerstart)
root.mainloop()
Спасибо!)
 

veDO

Новичок
Пользователь
Май 15, 2020
12
4
3
Немного переделал ваш код:
Python:
from tkinter import *
import time
import pyglet
import threading


# плеер
player = pyglet.media.Player()

root = Tk()
root.resizable(width=False, height=False)
root.geometry('320x150')
root.title('TIMER BY VEDO')
root['bg'] = 'white'
root.iconbitmap('clock.ico')
text_time = Label(text='Через сколько?(в мин, с, ч)',
                  font='Consolas 12',
                  fg='#3d3d42',
                  bg='#ccc')
test = Entry(root, font='Consolas 12', relief='raised')
enter = Button(text='Начать', relief='raised', font='TimesNewRoman 12')

# переменная для чекбокса
check = IntVar()
# привязка переменной к чекбоксу: variable=check
soundyes = Checkbutton(text='Не проигрывать звук по истечению времени?',
                       font='Consolas 9', bg='white', variable=check)

oscar = Label(text='Осталось 0с', font='Consolas 15', bg='white', fg='white')
text_time.pack()
test.pack()
soundyes.pack()
enter.pack()
oscar.pack()


# таймер
def timer(time2):
    while time2 > 0:
            print('Осталось ' + str(time2 - 1) + 'с')
            # изменение текста и фона лейбла
            oscar.config(text='Осталось ' + str(time2 - 1) + 'с', bg='black')
            time2 -= 1
            time.sleep(1)
 
    # скрываем лейбл
    oscar.config(bg='white')
    player.volume = 0.5  # громкость от 0 до 1
    # загружаем файл здесь чтобы можно было запускать таймер несколько раз
    # без перезапуска программы
    song = pyglet.media.load('C:/Users/Public/Music/bud.mp3')
    # добавляем в плейлист
    player.queue(song)
    # если не выбран чекбокс
    if not check.get():
        # проигрываем
        player.play()


def timerstart(event):
    try:
        timer = test.get()
        check = timer.replace('с',' с').replace('мин', ' мин').replace('ч', ' ч').replace('c', ' с').split()
        num = int(check[0])
        draft = check[1]
        if draft == 'ч':
            time2 = num * 3600
        elif draft == 'мин':
            time2 = num * 60
        elif draft == 'с':
            time2 = num
        time2 = int(time2)
        # запуск таймера в отдельном потоке
        threading.Thread(target=timer, args=[time2]).start()
    except:
        print('Ошибка!')


enter.bind('<Button-1>', timerstart)
root.mainloop()
Ещё раз спасибо, все круто, переделал под свой код, всё работает. Подскажите ещё пожалуйста, можно ли убрать при начале отсчета (функции таймер) все кроме лейбла оскар? И как это сделать
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ещё раз спасибо, все круто, переделал под свой код, всё работает. Подскажите ещё пожалуйста, можно ли убрать при начале отсчета (функции таймер) все кроме лейбла оскар? И как это сделать
Вот пример:
Python:
from tkinter import *
import time
import pyglet
import threading


player = pyglet.media.Player()
root = Tk()
root.resizable(False, False)
root.geometry('320x150')
root.title('TIMER BY VEDO')
root['bg'] = 'white'
root.iconbitmap('clock.ico')
text_time = Label(text='Через сколько?(в мин, с, ч)',
                  font='Consolas 12',
                  fg='#3d3d42',
                  bg='#ccc')
test = Entry(root, font='Consolas 12', relief='raised')
enter = Button(text='Начать', relief='raised', font='TimesNewRoman 12')

# переменная для чекбокса
check = IntVar()
soundyes = Checkbutton(text='Не проигрывать звук по истечению времени?',
                       font='Consolas 9', bg='white', variable=check)

oscar = Label(text='Осталось 0с', font='Consolas 15', bg='white', fg='white')
text_time.pack()
test.pack()
soundyes.pack()
enter.pack()
oscar.pack()


def timer2(time2):
    while time2 > 0:
        print('Осталось ' + str(time2 - 1) + 'с')
        oscar.config(text='Осталось ' + str(time2 - 1) + 'с', bg='black')
        # убираем все виджеты кроме лейбла oskar
        text_time.forget()
        test.forget()
        enter.forget()
        soundyes.forget()
        time2 -= 1
        time.sleep(1)

    print('Время вышло!')
    oscar.config(bg='white')
    player.volume = 0.1
    song = pyglet.media.load('C:/Users/Public/Music/bud.mp3')
    player.queue(song)
    if not check.get():
        player.play()
    # возвращаем все виджеты
    text_time.pack()
    test.pack()
    enter.pack()
    soundyes.pack()



def timerstart(event):
    try:
        timer = test.get()
        check = timer.replace('с', ' с').replace('мин', ' мин').replace('ч', ' ч').replace('c', ' с').split()
        num = int(check[0])
        draft = check[1]
        if draft == 'ч':
            time2 = num * 3600
        elif draft == 'мин':
            time2 = num * 60
        elif draft == 'с':
            time2 = num
        time2 = int(time2)
        threading.Thread(target=timer2, args=[time2]).start()
    except Exception as e:
        print('Ошибка!', e)


enter.bind('<Button-1>', timerstart)
root.mainloop()
 

veDO

Новичок
Пользователь
Май 15, 2020
12
4
3
Вот пример:
Python:
from tkinter import *
import time
import pyglet
import threading


player = pyglet.media.Player()
root = Tk()
root.resizable(False, False)
root.geometry('320x150')
root.title('TIMER BY VEDO')
root['bg'] = 'white'
root.iconbitmap('clock.ico')
text_time = Label(text='Через сколько?(в мин, с, ч)',
                  font='Consolas 12',
                  fg='#3d3d42',
                  bg='#ccc')
test = Entry(root, font='Consolas 12', relief='raised')
enter = Button(text='Начать', relief='raised', font='TimesNewRoman 12')

# переменная для чекбокса
check = IntVar()
soundyes = Checkbutton(text='Не проигрывать звук по истечению времени?',
                       font='Consolas 9', bg='white', variable=check)

oscar = Label(text='Осталось 0с', font='Consolas 15', bg='white', fg='white')
text_time.pack()
test.pack()
soundyes.pack()
enter.pack()
oscar.pack()


def timer2(time2):
    while time2 > 0:
        print('Осталось ' + str(time2 - 1) + 'с')
        oscar.config(text='Осталось ' + str(time2 - 1) + 'с', bg='black')
        # убираем все виджеты кроме лейбла oskar
        text_time.forget()
        test.forget()
        enter.forget()
        soundyes.forget()
        time2 -= 1
        time.sleep(1)

    print('Время вышло!')
    oscar.config(bg='white')
    player.volume = 0.1
    song = pyglet.media.load('C:/Users/Public/Music/bud.mp3')
    player.queue(song)
    if not check.get():
        player.play()
    # возвращаем все виджеты
    text_time.pack()
    test.pack()
    enter.pack()
    soundyes.pack()



def timerstart(event):
    try:
        timer = test.get()
        check = timer.replace('с', ' с').replace('мин', ' мин').replace('ч', ' ч').replace('c', ' с').split()
        num = int(check[0])
        draft = check[1]
        if draft == 'ч':
            time2 = num * 3600
        elif draft == 'мин':
            time2 = num * 60
        elif draft == 'с':
            time2 = num
        time2 = int(time2)
        threading.Thread(target=timer2, args=[time2]).start()
    except Exception as e:
        print('Ошибка!', e)


enter.bind('<Button-1>', timerstart)
root.mainloop()
3 раз спасибо)
 

Форум IT Специалистов