wxPython MacOS X Lion полноэкранный режим

Я делаю приложение wxPython, которое должно работать в полноэкранном режиме. Я хочу использовать новый полноэкранный режим, который появился в OS X Lion. Как сделать так, чтобы в правом верхнем углу отображался полноэкранный значок?


person Ibrahim Muhammad    schedule 08.09.2012    source источник
comment
Что ты пробовал? Быстрый поиск в Google по запросу wxpython в полноэкранном режиме показал несколько различных вариантов.   -  person acattle    schedule 08.09.2012
comment
Он специально хочет использовать новый полноэкранный API Lion. wxWidgets пока не имеет этой функции.   -  person nneonneo    schedule 08.09.2012
comment
@nneonneo Это может быть так, но вопрос в том виде, в котором он написан, не отражает каких-либо независимых исследовательских усилий, что противоречит принципам сообщества.   -  person acattle    schedule 08.09.2012
comment
Я бы тоже не знал, как это сделать ... это новая функция OS X, и пока что не так много графических интерфейсов, кроме собственной поддержки Apple.   -  person nneonneo    schedule 08.09.2012


Ответы (1)


Пока не будет исправлена ошибка № 14357, прямого способа сделать это не будет. используя только известные мне функции wxPython.

Однако вы можете обойти wxWidgets и напрямую получить доступ к API-интерфейсам Какао, чтобы делать то, что вам нужно. Обратите внимание, что вы должны использовать привязки wxMac / Cocoa (wxPython 2.9 или выше).

Это код, необходимый для полноэкранного режима:

# from http://stackoverflow.com/questions/12328143/getting-pyobjc-object-from-integer-id
import ctypes, objc
_objc = ctypes.PyDLL(objc._objc.__file__)

# PyObject *PyObjCObject_New(id objc_object, int flags, int retain)
_objc.PyObjCObject_New.restype = ctypes.py_object
_objc.PyObjCObject_New.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_int]

def objc_object(id):
    return _objc.PyObjCObject_New(id, 0, 1)

def SetFullScreenCapable(frame):
    frameobj = objc_object(frame.GetHandle())

    NSWindowCollectionBehaviorFullScreenPrimary = 1<<7
    window = frameobj.window()
    newBehavior = window.collectionBehavior() | NSWindowCollectionBehaviorFullScreenPrimary
    window.setCollectionBehavior_(newBehavior)

А вот небольшое тестовое приложение, которое это демонстрирует:

import wxversion
wxversion.select('2-osx_cocoa') # require Cocoa version of wxWidgets
import wx

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        wx.Button(self, label="Hello!") # test button to demonstrate full-screen resizing
        SetFullScreenCapable(self)

    def OnClose(self, event):
        exit()

app = wx.App()
frame = Frame()
frame.Show()
app.MainLoop()
person nneonneo    schedule 08.09.2012
comment
При использовании приведенного выше кода в MountainLion 10.8.2 с python 2.7.2 я получаю AttributeError: объект 'NSHIObject' не имеет атрибута 'window', весь код и ошибка здесь stackoverflow.com/questions/14068923/ I подозреваю, что мне чего-то не хватает, потому что я не понимаю, почему код вызывает ошибку (ну, почему у него не было атрибута окна) - person Zimm3r; 17.01.2013
comment
С тех пор я ответил на вопрос, связанный с Carbon или Cocoa в качестве бэкэнда, см. Ответ на вопрос для получения дополнительной информации. - person Zimm3r; 19.01.2014