Повторный запуск приложения
Как можно отследить открытую копию приложения и закрыть основное?
Я прочитал что для этого используются мьютексы и семафоры, но как это связать с PyQt5 не знаю.
Например я запускаю приложение, и после его запуска снова его открываю. Как мне, например, предупредить что приложение уже запущено?
Надеюсь на Вашу помощь.
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Вы можете добиться чего-то подобного с помощью модуля win32gui.
Чтобы установить его, введите в CMD pip install win32gui .
Теперь это код:
import win32gui
import sys
def windowEnumerationHandler(hwnd, top_windows):
top_windows.append((hwnd, win32gui.GetWindowText(hwnd)))
top_windows = []
win32gui.EnumWindows(windowEnumerationHandler, top_windows)
for i, min in enumerate(top_windows):
if min[1]:
print(f'{i:>4} --> {min[1]} ')
# w.setWindowTitle("Test q1346046.py")
# vvvvvvvvvvvvvvvv ^^^^^^^^^^^^^^^^
if "Test q1346046.py" in min[1]:
print(min, '<---- это приложение уже запущено ранее.')
win32gui.ShowWindow(min[0], 5)
win32gui.SetForegroundWindow(min[0])
sys.exit()
break
# ВАША ПРОГРАММА ЗДЕСЬ vvvvvvvvvvvvvvvvvvvvvvvvvvv
from PyQt5.QtWidgets import QApplication, QWidget
def main():
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 200)
# vvvvvvvvvvvvvvvv
w.setWindowTitle('Test q1346046.py') # !!! +++
# ^^^^^^^^^^^^^^
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Обычно вначале программа получает имя каждого открытого окна.
Если имя окна совпадает с именем программы, оно выводит программу на передний план и закрывает ее.
Если нет, то открывается новая программа.
