Программа с графическим интерфейсом обычно использует управляемую событиями модель исполнения.Это означает, что вы создаете графический интерфейс, и он находится в цикле, ожидая событий, на которые он реагирует.Но в вашей программе есть бесконечный цикл while
, поэтому графический интерфейс не имеет возможности что-либо делать.
Есть более эффективные способы сделать это, но вот исправленная версия вашего кода с минимальными изменениями.
Не рекомендуется использовать time.sleep
в программе с графическим интерфейсом, потому что это переводит все в спящий режим, поэтому графический интерфейс не может реагировать на события.В Tkinter вы можете периодически вызывать функцию, используя метод .after
.
import tkinter as tk
hours = int(input("what hour is it? "))
minutes = int(input("what minute is it? "))
seconds = int(input("what second is it? "))
window = tk.Tk()
texthours = tk.Text(window, width=2, height=1)
textminutes = tk.Text(window, width=2, height=1)
textseconds = tk.Text(window, width=2, height=1)
texthours.pack(side=tk.LEFT)
textminutes.pack(side=tk.LEFT)
textseconds.pack(side=tk.LEFT)
def show_time():
global hours, minutes, seconds
texthours.delete(0.0, tk.END)
textminutes.delete(0.0, tk.END)
textseconds.delete(0.0, tk.END)
texthours.insert(tk.END, hours)
textminutes.insert(tk.END, minutes)
textseconds.insert(tk.END, seconds)
seconds = seconds + 1
if seconds == 60:
minutes = minutes + 1
seconds = 0
if minutes == 60:
hours = hours + 1
minutes = 0
if hours == 24:
hours = 0
window.after(1000, show_time)
window.after(1000, show_time)
window.mainloop()
Вот немного лучшая версия, которая объединяет все в класс, поэтому нам не нужно использоватьglobal
.Это требует немного большего набора текста, но делает его более управляемым, особенно в больших сложных графических интерфейсах.
import tkinter as tk
class Clock:
def __init__(self):
self.hours = int(input("what hour is it? "))
self.minutes = int(input("what minute is it? "))
self.seconds = int(input("what second is it? "))
self.window = tk.Tk()
self.texthours = tk.Text(self.window, width=2, height=1)
self.textminutes = tk.Text(self.window, width=2, height=1)
self.textseconds = tk.Text(self.window, width=2, height=1)
self.texthours.pack(side=tk.LEFT)
self.textminutes.pack(side=tk.LEFT)
self.textseconds.pack(side=tk.LEFT)
self.window.after(1000, self.show_time)
self.window.mainloop()
def show_time(self):
self.texthours.delete(0.0, tk.END)
self.textminutes.delete(0.0, tk.END)
self.textseconds.delete(0.0, tk.END)
self.texthours.insert(tk.END, self.hours)
self.textminutes.insert(tk.END, self.minutes)
self.textseconds.insert(tk.END, self.seconds)
self.seconds += 1
if self.seconds == 60:
self.minutes += 1
self.seconds = 0
if self.minutes == 60:
self.hours += 1
self.minutes = 0
if self.hours == 24:
self.hours = 0
self.window.after(1000, self.show_time)
Clock()