Как заставить приложение tkinter запускать только один экземпляр? - PullRequest
2 голосов
/ 25 февраля 2020

Я сделал приложение Python GUI, используя tkinter. У меня проблема в том, что вы можете запустить столько экземпляров, сколько захотите. Но я хочу, чтобы только один экземпляр работал, если приложение уже запущено, и я снова нажимаю EXE или ярлык, вместо этого оно должно обратить внимание на работающее приложение.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

Я бы использовал файл блокировки, например, с библиотекой filelock . Создайте произвольный файл: если файл разблокирован, запустите GUI и заблокируйте файл. Если файл заблокирован, просто выйдите.

1 голос
/ 25 февраля 2020

Простой кроссплатформенный прием - записать идентификатор процесса (pid) первого экземпляра в файл в известном месте (например, my_program.pid во системном временном каталоге). При каждом запуске проверяйте, существует ли этот файл. Если он существует, прочитайте pid и проверьте, запущен ли процесс. Если процесс все еще выполняется, выйдите. Если нет, продолжайте работу и запишите свой идентификатор процесса в файл. Когда программа, написавшая файл, завершает работу, она должна удалить файл.

Возможны условия гонки (например, работающая программа может завершить работу в короткий момент после проверки, но до того, как ваша программа решит выйти), но если вы не создаете приложение коммерческого уровня, это обычно хорошо достаточно.

0 голосов
/ 25 февраля 2020

У меня на самом деле есть приложение windows, которое делает это с помощью pywin32.

. Оно ищет имя приложения, если оно существует, выводит его на передний план и закрывает дополнительную программу.

version = "Program Name"

import win32gui
import sys

# Checks if there is a currently running program
# If there is, brings up that program
hwnd = win32gui.FindWindow(None, version)
if hwnd:
    win32gui.ShowWindow(hwnd, 5)
    win32gui.SetForegroundWindow(hwnd)
    sys.exit(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...