Как обнаружить, запускается ли приложение OS X уже

Просто добавьте arg к вашему событию entry_focusout и привяжите к виджетам Entry с помощью лямбда-функции.

from tkinter import *

root = Tk()

def entry_click(event):
  if event.widget["foreground"] == "grey":
     event.widget.delete(0, "end")
     event.widget.insert(0, "")
     event.widget.configure(fg="black")

def entry_focusout(event, msg):
    if not event.widget.get():
       event.widget.configure(fg="grey") #you had a typo here
       event.widget.insert(0, msg)

new_name = Entry(root,fg="grey")
new_name.insert(0, "enter name")
new_name.bind('<FocusIn>', entry_click)
new_name.bind('<FocusOut>', lambda e: entry_focusout(e, "enter name"))

new_email = Entry(root,fg="grey")
new_email.insert(0, "enter email")
new_email.bind('<FocusIn>', entry_click)
new_email.bind('<FocusOut>', lambda e: entry_focusout(e, "enter email"))

new_name.pack()
new_email.pack()

root.mainloop()
20
задан John Topley 4 July 2009 в 22:41
поделиться

4 ответа

Решение низкого уровня состоит в том, чтобы использовать скопление ().

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

Обратите внимание, что безотносительно решения Вы выбираете, необходимо принять сознательное решение относительно того, что это означает иметь "несколько экземпляров". А именно, если многочисленные пользователи запускают Ваше приложение одновременно, что в порядке?

9
ответ дан 29 November 2019 в 23:02
поделиться

Прежде всего это - “Mac OS X” или “OS X”. Нет такой вещи как “OS/X”.

Во-вторых, Mac OS X не идет с Повышением; необходимо было бы связать его приложением.

В-третьих, большая часть Углерода не доступна в 64-разрядном. Это - чистый сигнал, что те части Углерода уйдут когда-нибудь (когда отказы Apple, 32-разрядные в ее аппаратных средствах). Рано или поздно необходимо будет или переписать приложение с Какао или отказаться от Mac.

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

Нет это не может. Запуск переименованного или перемещенного приложения просто активируется (выявляют) процесс, который уже работал; это не запустит новый, второй процесс вместе с первым.


Существует несколько способов сказать, работает ли приложение уже. В каждом случае Вы делаете это на запуске:

  1. Используйте NSConnection Какао для регистрации соединения в единственном постоянном имени. Это перестанет работать, если имя будет уже зарегистрировано. (Можно использовать Основу из Углеродного приложения; это - Набор Приложения, с которым необходимо быть осторожными.)
  2. Используйте Диспетчер процессов для сканирования списка процессов для процессов, соответствие идентификатора пакета которых то Вы ищете. Идентификатор пакета не является неизменным, но более трудно измениться, чем имя файла или местоположение.
  3. Если Вы надеетесь видеть, когда кто-то выполняет вторую копию себя, можно использовать CFNotificationCenter:

    1. Добавьте себя как наблюдатель для “com.yourdomain.yourappname. LaunchResponse”.
    2. Отправьте уведомление под именем “com.yourdomain.yourappname. LaunchCall”.
    3. Добавьте себя как наблюдатель для “com.yourdomain.yourappname. LaunchCall”.

    В Вашем обратном вызове наблюдения для Уведомления о вызове отправьте уведомление об Ответе.
    В Вашем обратном вызове наблюдения для уведомления об Ответе, выхода.

    Таким образом, когда первый процесс запускается, он Назовет и не получит Ответа; когда второй процесс запустится, он Назовет, получит Ответ от первого процесса и выйдет из уважения к первому.

3
ответ дан 29 November 2019 в 23:02
поделиться

Что относительно IPC? Вы могли открыть сокет и согласовать с другим запущенным экземпляром. Необходимо было бы быть осторожными, хотя, что это работает, если оба приложения запускаются одновременно.

Я не могу предоставить Вам пример кода, поскольку я не имею (все же, но я скоро буду), использовал его.

1
ответ дан 29 November 2019 в 23:02
поделиться

Как уже упоминалось, Какао-приложения обычно не позволяют запускать более одного экземпляра за раз.

В общем, какао-способ решить эту проблему с запущенными приложениями в NSWorkspace. Это возвращает NSArray, содержащий словарь для каждого запущенного приложения. Вы можете просмотреть массив, чтобы узнать, запущено ли приложение, которое вы ищете. Я бы посоветовал вам использовать значение с ключом NSApplicationBundleIdentifier, который будет иметь значение типа com.mycompany.myapp, а не искать имя. Если вам нужно найти идентификатор пакета для приложения, вы можете посмотреть его файл info.plist в пакете приложения.

4
ответ дан 29 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: