Поведение NSAlert с runModal

Я новичок в программировании OSX. Я использую pyobjc для создания предупреждений. Мое понимание модальных окон или диалогов заключается в том, что модальные окна требуют действий пользователя, прежде чем они смогут продолжить работу. Однако, если я использую runModal из NSAlert, я все еще могу перейти к другим приложениям, пока предупреждение все еще отображается. Я неправильно понимаю модальные диалоги.

class Alert(object):

    def __init__(self, messageText):
        super(Alert, self).__init__()
        self.messageText = messageText
        self.informativeText = ""
        self.buttons = []

    def displayAlert(self):
        alert = NSAlert.alloc().init()
        alert.setMessageText_(self.messageText)
        alert.setInformativeText_(self.informativeText)
        # alert.setAlertStyle_(NSInformationalAlertStyle)
        alert.setAlertStyle_(NSCriticalAlertStyle)
        for button in self.buttons:
            alert.addButtonWithTitle_(button)
        NSApp.activateIgnoringOtherApps_(True)
        self.buttonPressed = alert.runModal()


def alert(message="Default Message", info_text="", buttons=["OK"]):
    ap = Alert(message)
    ap.informativeText = info_text
    ap.buttons = buttons
    ap.displayAlert()
    return ap.buttonPressed

person Pradeep Vairamani    schedule 05.08.2014    source источник


Ответы (1)


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

В случае вашего кода вы создаете модальный диалог приложения, как описано в NSAlert Документация.

person Petesh    schedule 05.08.2014
comment
Спасибо! Есть ли способ создать модальные диалоги системного уровня в OSX, желательно с использованием PyObjC? - person Pradeep Vairamani; 05.08.2014
comment
Я ничего не знаю, потому что я не пытался это сделать. Системные модальные диалоги невероятно враждебны пользователю. Почему вы хотите причинить что-то подобное другим пользователям? - person Petesh; 05.08.2014
comment
К сожалению, это требование. Я почти уверен, что есть способ сделать это, потому что он используется в приложении Mac для синхронизации Box. - person Pradeep Vairamani; 06.08.2014
comment
Я не вижу доказательств того, что в приложении на коробке это мешает переключению на другие приложения. Что я вижу, так это поведение обычных окон «всегда сверху». Этого можно добиться, установив уровень с помощью вызова окна setLevel на NSStatusWindowLevel. Однако это не то, что вы можете сделать с помощью NSAlert API. - person Petesh; 06.08.2014