Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
213 / 109 / 46
Регистрация: 12.12.2016
Сообщений: 399
PyQt5

Разное время в лейблах

26.09.2022, 13:18. Показов 1172. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане!
Подскажите как можно доработать код, чтобы последняя колонка (где должно быть время) было в реальном времени и с учетом часового пояса (интервала).
Мысль была такая: всем лейблам, идущим после QFrame, присвоить поряковый номер (setObjectName), и для каждого лейбла кратному 4 вызывать ф-ю show_current_time, но что-то не получилось.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
import pytz
from datetime import datetime
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QLabel, QFrame
 
 
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.gridLayoutWidget = QWidget()
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setSpacing(30)
        self.setLayout(self.gridLayout)
        self.initUI()
 
    def show_current_time(self, interval, label_):
        self.timer = QTimer()
        self.timer.setInterval(interval)
        self.timer.timeout.connect(lambda: self.label_.setText(QTime.currentTime().toString("hh:mm:ss")))
        self.timer.start()
 
    def initUI(self):
        # заголовки колонок
        top_names = ["Аббр.", "Разница с МСК", "Часовой пояс", "Текущее время"]
        top_positions = [(i, j) for i in range(1) for j in range(4)]
        for top_position, top_name in zip(top_positions, top_names):
            top_label = QLabel(top_name)
            top_label.setFont(QFont('calibri', 30))
            top_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            top_label.setStyleSheet("font-weight: bold")
 
            self.line = QFrame(self.gridLayoutWidget)
            self.line.setObjectName(f"line_{top_position[1]}")
            self.line.setFrameShape(QFrame.HLine)
            self.line.setFrameShadow(QFrame.Sunken)
 
            self.gridLayout.addWidget(top_label, 0, top_position[1], 1, 1)
            self.gridLayout.addWidget(self.line, 1, top_position[1], 1, 1)
 
        # колонки с часовыми поясами
        names = ["KALT", "-1", "Калининград", f"", # {datetime.now(pytz.timezone('Europe/Kaliningrad')).strftime('%H:%M:%S')}
                 "MSK", "0", "Москва", f"", #f"{datetime.now(pytz.timezone('Europe/Moscow')).strftime('%H:%M:%S')}",
                 "SAMT", "+1", "Самара", f"{datetime.now(pytz.timezone('Europe/Samara')).strftime('%H:%M:%S')}",
                 "YEKT", "+2", "Екатеринбург", f"{datetime.now(pytz.timezone('Asia/Yekaterinburg')).strftime('%H:%M:%S')}",
                 "OMST", "+3", "Омск", f"{datetime.now(pytz.timezone('Asia/Omsk')).strftime('%H:%M:%S')}",
                 "KRAT", "+4", "Красноярск", f"{datetime.now(pytz.timezone('Asia/Krasnoyarsk')).strftime('%H:%M:%S')}",
                 "IRKT", "+5", "Иркутск", f"{datetime.now(pytz.timezone('Asia/Irkutsk')).strftime('%H:%M:%S')}",
                 "YAKT", "+6", "Якутск", f"{datetime.now(pytz.timezone('Asia/Yakutsk')).strftime('%H:%M:%S')}",
                 "VLAT", "+7", "Владивосток", f"{datetime.now(pytz.timezone('Asia/Vladivostok')).strftime('%H:%M:%S')}",
                 "MAGT", "+8", "Магадан", f"{datetime.now(pytz.timezone('Asia/Magadan')).strftime('%H:%M:%S')}",
                 "PETT", "+9", "Камчатка", f"{datetime.now(pytz.timezone('Asia/Kamchatka')).strftime('%H:%M:%S')}"]
 
        positions = [(i, j) for i in range(12) for j in range(4)]
        for position, name in zip(positions, names):
            label = QLabel(name)
            label.setFont(QFont('Lato', 30))
            label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            self.gridLayout.addWidget(label, position[0] + 2, position[1], 1, 1)
            # self.gridLayout.addWidget(label_, position[0] + 2, 3, 1, 1) # <- заменить на время
 
        self.move(150, 10)
        self.setWindowTitle("Время в России")
        self.show()
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2022, 13:18
Ответы с готовыми решениями:

Не отображаются pixmap на лейблах в PyQt
Делаю проект на pyqt5, вот как он выглядит (1 изображение) но при запуске пайтон кода или при предпросмотре в qtdesigner, он не загружает...

Разное время задержки
Здравствуйте. Такая проблема, есть функция, которая должна выполняться каждые N минут. Причем минуты могут быть разные. Например:...

Разное время выполнения программ
Здравствуйте! Почему скорость выполнения функций отличается в зависимости от того где они запускаются? Если запускаю в консоле -...

7
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,656
26.09.2022, 15:41
Лучший ответ Сообщение было отмечено New Life как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
import pytz
from datetime import datetime
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QLabel, QFrame
 
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.gridLayoutWidget = QWidget()
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setSpacing(30)
        self.setLayout(self.gridLayout)
        self.initUI()
        self.timer = QTimer()
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.updateTime)
        self.timer.start()
 
    def updateTime(self):
       names = self.names()
       for i in range(3, len(names), 4):
         label = self.gridLayout.itemAtPosition(2+(i-3)//4, 3).widget()
         label.setText(names[i])
 
    def names(self):
        # колонки с часовыми поясами
        result = ["KALT", "-1", "Калининград", f"{datetime.now(pytz.timezone('Europe/Kaliningrad')).strftime('%H:%M:%S')}",
                  "MSK", "0", "Москва", f"{datetime.now(pytz.timezone('Europe/Moscow')).strftime('%H:%M:%S')}",
                  "SAMT", "+1", "Самара", f"{datetime.now(pytz.timezone('Europe/Samara')).strftime('%H:%M:%S')}",
                  "YEKT", "+2", "Екатеринбург", f"{datetime.now(pytz.timezone('Asia/Yekaterinburg')).strftime('%H:%M:%S')}",
                  "OMST", "+3", "Омск", f"{datetime.now(pytz.timezone('Asia/Omsk')).strftime('%H:%M:%S')}",
                  "KRAT", "+4", "Красноярск", f"{datetime.now(pytz.timezone('Asia/Krasnoyarsk')).strftime('%H:%M:%S')}",
                  "IRKT", "+5", "Иркутск", f"{datetime.now(pytz.timezone('Asia/Irkutsk')).strftime('%H:%M:%S')}",
                  "YAKT", "+6", "Якутск", f"{datetime.now(pytz.timezone('Asia/Yakutsk')).strftime('%H:%M:%S')}",
                  "VLAT", "+7", "Владивосток", f"{datetime.now(pytz.timezone('Asia/Vladivostok')).strftime('%H:%M:%S')}",
                  "MAGT", "+8", "Магадан", f"{datetime.now(pytz.timezone('Asia/Magadan')).strftime('%H:%M:%S')}",
                  "PETT", "+9", "Камчатка", f"{datetime.now(pytz.timezone('Asia/Kamchatka')).strftime('%H:%M:%S')}"]
        return result
 
    def initUI(self):
        # заголовки колонок
        top_names = ["Аббр.", "Разница с МСК", "Часовой пояс", "Текущее время"]
        top_positions = [(i, j) for i in range(1) for j in range(4)]
        for top_position, top_name in zip(top_positions, top_names):
            top_label = QLabel(top_name)
            top_label.setFont(QFont('calibri', 30))
            top_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            top_label.setStyleSheet("font-weight: bold")
 
            self.line = QFrame(self.gridLayoutWidget)
            self.line.setObjectName(f"line_{top_position[1]}")
            self.line.setFrameShape(QFrame.HLine)
            self.line.setFrameShadow(QFrame.Sunken)
 
            self.gridLayout.addWidget(top_label, 0, top_position[1], 1, 1)
            self.gridLayout.addWidget(self.line, 1, top_position[1], 1, 1)
        
        positions = [(i, j) for i in range(12) for j in range(4)]
        for position, name in zip(positions, self.names()):
            label = QLabel(name)
            label.setFont(QFont('Lato', 30))
            label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            self.gridLayout.addWidget(label, position[0] + 2, position[1], 1, 1)
 
        self.move(150, 10)
        self.setWindowTitle("Время в России")
        self.show()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
2
213 / 109 / 46
Регистрация: 12.12.2016
Сообщений: 399
26.09.2022, 15:41  [ТС]
Спасибо
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,656
26.09.2022, 15:52
У вас проблема в том (я не знаю как по питонски правильно выразится), что f-string хранит результат форматирования, а не сам код форматирования, как хотелось бы.

Добавлено через 6 минут
Может стОит както запрашивать только одно время и потом от него отсчитывать часы, думаю быстрее работать будет.
0
213 / 109 / 46
Регистрация: 12.12.2016
Сообщений: 399
26.09.2022, 16:22  [ТС]
kapbepucm, переделал так (убрав f-строки), но не получается/не знаю как можно передалать в цикл (чтобы последняя колонка) атвоматически заполнялась с учетом addSecs и названием лейбла(?).
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QLabel, QFrame
 
 
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.gridLayoutWidget = QWidget()
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setSpacing(30)
        self.setLayout(self.gridLayout)
        self.initUI()
 
        self.showTime()
 
    # method called by timer
    def showTime(self):
        # 3600 sec = 1h
        current_time = QTime.currentTime().addSecs(-3600)  # getting current time
        label_time = current_time.toString('hh:mm:ss')  # converting QTime object to string
        self.label_1.setFont(QFont('calibri', 30))
        self.label_1.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.label_1.setText(label_time)  # showing it to the label
 
    def initUI(self):
        self.label_1 = QLabel()
        timer = QTimer(self)
        timer.timeout.connect(self.showTime)
        timer.start(1000) # update the timer every second
 
        self.gridLayout.addWidget(self.label_1, 2, 3, 1, 1)  # Калининград
        # self.gridLayout.addWidget(self.label_1, 3, 3, 1, 1)  # Москва
        # self.gridLayout.addWidget(self.label_1, 4, 3, 1, 1)  # Самара
 
        # заголовки колонок
        top_names = ["Аббр.", "Разница с МСК", "Часовой пояс", "Текущее время"]
        top_positions = [(i, j) for i in range(1) for j in range(4)]
        for top_position, top_name in zip(top_positions, top_names):
            top_label = QLabel(top_name)
            top_label.setFont(QFont('calibri', 30))
            top_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            top_label.setStyleSheet("font-weight: bold")
 
            self.line = QFrame(self.gridLayoutWidget)
            self.line.setObjectName(f"line_{top_position[1]}")
            self.line.setFrameShape(QFrame.HLine)
            self.line.setFrameShadow(QFrame.Sunken)
 
            self.gridLayout.addWidget(top_label, 0, top_position[1], 1, 1)
            self.gridLayout.addWidget(self.line, 1, top_position[1], 1, 1)
 
        # колонки с часовыми поясами
        names = ["KALT", "-1", "Калининград",
                 "MSK", "0", "Москва",
                 "SAMT", "+1", "Самара",
                 "YEKT", "+2", "Екатеринбург",
                 "OMST", "+3", "Омск",
                 "KRAT", "+4", "Красноярск",
                 "IRKT", "+5", "Иркутск",
                 "YAKT", "+6", "Якутск",
                 "VLAT", "+7", "Владивосток",
                 "MAGT", "+8", "Магадан",
                 "PETT", "+9", "Камчатка"]
 
        positions = [(i, j) for i in range(12) for j in range(3)]
        for position, name in zip(positions, names):
            label = QLabel(name)
            label.setFont(QFont('Lato', 30))
            label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            self.gridLayout.addWidget(label, position[0] + 2, position[1], 1, 1)
 
        self.move(150, 10)
        self.setWindowTitle("Время в России")
        self.show()
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())
Добавлено через 7 минут
kapbepucm, А как работает Ваш код? - В ф-и updateTime() в последней колонке каждую секунду обновляется текст лейбла?
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,656
26.09.2022, 19:42
Лучший ответ Сообщение было отмечено New Life как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QLabel, QFrame
 
 
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.gridLayoutWidget = QWidget()
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setSpacing(30)
        self.setLayout(self.gridLayout)
        self.initUI()
 
        self.showTime()
 
    # method called by timer
    def showTime(self):
        for i in range(0, len(self.names), 3):
          secs = self.names[i+1]*3600
          # 3600 sec = 1h
          current_time = QTime.currentTime().addSecs(secs)  # getting current time
          label_time = current_time.toString('hh:mm:ss')  # converting QTime object to string
          label = self.gridLayout.itemAtPosition(i//3+2, 3).widget()
          label.setText(label_time)  # showing it to the label
 
    def initUI(self):
        # заголовки колонок
        top_names = ["Аббр.", "Разница с МСК", "Часовой пояс", "Текущее время"]
        top_positions = [(i, j) for i in range(1) for j in range(4)]
        for top_position, top_name in zip(top_positions, top_names):
            top_label = QLabel(top_name)
            top_label.setFont(QFont('calibri', 30))
            top_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            top_label.setStyleSheet("font-weight: bold")
 
            self.line = QFrame(self.gridLayoutWidget)
            self.line.setObjectName(f"line_{top_position[1]}")
            self.line.setFrameShape(QFrame.HLine)
            self.line.setFrameShadow(QFrame.Sunken)
 
            self.gridLayout.addWidget(top_label, 0, top_position[1], 1, 1)
            self.gridLayout.addWidget(self.line, 1, top_position[1], 1, 1)
 
        # колонки с часовыми поясами
        self.names = ["KALT", "-1", "Калининград",
                      "MSK", "0", "Москва",
                      "SAMT", "+1", "Самара",
                      "YEKT", "+2", "Екатеринбург",
                      "OMST", "+3", "Омск",
                      "KRAT", "+4", "Красноярск",
                      "IRKT", "+5", "Иркутск",
                      "YAKT", "+6", "Якутск",
                      "VLAT", "+7", "Владивосток",
                      "MAGT", "+8", "Магадан",
                      "PETT", "+9", "Камчатка"]
 
        positions = [(i, j) for i in range(12) for j in range(3)]
        for position, name in zip(positions, self.names):
            label = QLabel(name)
            label.setFont(QFont('Lato', 30))
            label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            self.gridLayout.addWidget(label, position[0] + 2, position[1], 1, 1)
 
        for i in range(1, len(self.names), 3):
          self.names[i] = int(self.names[i])
          label = QLabel()
          label.setFont(QFont('calibri', 30))
          label.setAlignment(Qt.AlignmentFlag.AlignCenter)
          self.gridLayout.addWidget(label, (i-1)//3+2, 3, 1, 1)
 
        timer = QTimer(self)
        timer.timeout.connect(self.showTime)
        timer.start(1000) # update the timer every second
 
        self.move(150, 10)
        self.setWindowTitle("Время в России")
        self.show()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
Добавлено через 1 минуту
Только это всё будет работать, если на локальной машине Москва

Добавлено через 2 минуты
Цитата Сообщение от New Life Посмотреть сообщение
kapbepucm, А как работает Ваш код? - В ф-и updateTime() в последней колонке каждую секунду обновляется текст лейбла?
угу
1
213 / 109 / 46
Регистрация: 12.12.2016
Сообщений: 399
26.09.2022, 20:35  [ТС]
Цитата Сообщение от kapbepucm Посмотреть сообщение
Только это всё будет работать, если на локальной машине Москва
Из-за QTime.currentTime() ? Думаю можно какую-то проверку сделать, хотя первое решение в таком случае проще)
0
 Аватар для kapbepucm
1566 / 739 / 321
Регистрация: 02.05.2020
Сообщений: 1,656
27.09.2022, 08:37
ну время можно брать из первого решения и от него делать сдвиги по второму
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2022, 08:37
Помогаю со студенческими работами здесь

Разное время исполнения программы
&quot;Баловался&quot; с кодом питона и наткнулся на интересный результат: один и тот же код выполняется разное время. Почему так? Понятно, что...

Компьютер вырубается во время игр каждый раз через разное время
помогите пожалуйста* компьютер Acer aspire m3201. * ** ** * Тип ЦП* ** ** ** ** ** ** ** ** ** ** ** ** ** ** TripleCore AMD Phenom X3...

Разное время для филиалов (местное время)
Есть 3 поля: 1. Филиал 2. Время местное 3. Время по филиалу. Как сделать так чтобы в зависимости от выбранного филиала к местному...

OffsetDateTime.now() разное время
Здравствуйте, Использую OffsetDateTime.now() и получаю формат времени YYYY-MM-ddThh-mm-ss:SSS +/-hh.mm Но один и тот же мотод на...

Время в JS и PHP разное
Привет! Не понятно почему когда я получаю UNIX время в js и php получаются разные значения. Вообще задача сравнить в 10 минутном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru