#python #user-interface #tkinter
#python #пользовательский интерфейс #tkinter
Вопрос:
Я создаю графический интерфейс таймера обратного отсчета с использованием Tkinter, где пользователь выбирает количество секунд, на которое ведется обратный отсчет, используя встроенную функцию масштабирования. Сам обратный отсчет, казалось, работал, но даже когда ползунок перемещается вверх, он будет отсчитывать от самого низкого (‘from_’) значения 40. Я попытался изменить значение .get() на локальную переменную и поместить это в функцию, обратный отсчет больше не работает и просто отображает число, на которое был установлен ползунок (хотя теперь оно меняется в зависимости от пользовательского ввода). Я вставлю приведенный ниже код, который, надеюсь, устранит любую двусмысленность. Кроме того, попытка выполнить это без глобальной переменной и с переменной только вне функции создает ошибку (ссылка на нее перед назначением). Любая помощь приветствуется. Приведенный ниже код является версией локальной переменной:
window = tk.Tk()
window.configure(bg='black')
window.title('TUT Timer')
slider = tk.Scale(window, from_=40, to=60, fg='#39FF14', bg='black', orient=HORIZONTAL)
slider.grid(sticky='nsew')
time_var = slider.get()
def timer():
time_var = slider.get()
if time_var > 0:
time_label.config(text=time_var)
time_var = time_var -1
time_label.after(1000, timer)
elif time_var == 0:
time_label.config(text='0')
def start_button():
timer()
start = tk.Button(text='Start', command=start_button, bg='black', fg='#39FF14')
start.grid()
time_label = tk.Label(text = '00:00', height = 3, bg= 'black', fg= '#39FF14')
time_label.config(font=('Courier New', 20))
time_label.grid(sticky='nsew')
window.mainloop()
Там, где я использовал глобальную переменную, код был таким же, но с global time_var
выше или вместо time_var = slider.get()
внутри функции timer (пробовал оба, вместо создает рабочий обратный отсчет, но не начинается со значения scale).
Подводя итог, было запущено две версии кода, но ни одна из них не работала полностью. Использовалась глобальная переменная, но функция scale .get не изменилась в зависимости от изменения ползунка. Другой вариант использовал ту же переменную, но как локальную переменную, в результате чего просто отображался начальный номер, а не начало обратного отсчета. Ценю любую помощь в том, чтобы заставить это работать, если это возможно!
Ответ №1:
Вы получаете значение slider каждый раз, которое никогда не меняется. Вы должны иметь возможность использовать метод set (), чтобы изменить ползунок, чтобы двигаться вместе с ним, если хотите, но я не думаю, что это то, что вы хотите сделать.
import tkinter as tk
window = tk.Tk()
window.configure(bg='black')
window.title('TUT Timer')
slider = tk.Scale(window, from_=40, to=60, fg='#39FF14', bg='black', orient=tk.HORIZONTAL)
slider.grid(sticky='nsew')
def timer(time_var):
if time_var > 0:
time_label.config(text=str(time_var))
time_var = time_var - 1
window.after(1000, lambda: timer(time_var))
elif not time_var:
time_label.config(text='0')
def start_button():
time_var = slider.get()
timer(time_var)
start = tk.Button(text='Start', command=start_button, bg='black', fg='#39FF14')
start.grid()
time_label = tk.Label(text='00:00', height=3, bg='black', fg='#39FF14')
time_label.config(font=('Courier New', 20))
time_label.grid(sticky='nsew')
window.mainloop()
Этот код работает, но он позволяет вам устанавливать несколько таймеров одновременно. Вы могли бы использовать глобальную переменную, как и раньше, но тогда время просто будет уменьшаться быстрее. Возможно, вам придется использовать значение bool, чтобы указать, когда таймер запущен, чтобы не запускать его снова. Вы также можете отключить свою кнопку и снова включить ее, когда таймер завершится.
Комментарии:
1. Спасибо! Это устраняет проблему и очень полезно с точки зрения того, как подходить к такого рода вещам в будущем
2. В этом случае вам не нужно использовать
lamba
withafter
.after
позволяет передавать аргументы:after(1000, timer, tim_var)