Gdk.Screen.get_default() не работает после PyInstaller

И снова у меня проблема с исполняемыми файлами, скомпилированными PyInstaller, которые не работают так же, как скрипты Python...

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

# Get screen size for Linux
from gi.repository.Gdk import Screen 
def GetResolution():
    screenvar = Screen.get_default()
    width = screenvar.get_width()
    height = screenvar.get_height()
    return [width, height]

При запуске с Python он работает отлично.

Однако исполняемый файл, созданный с помощью PyInstaller, потерпел крах. Сначала я подумал, что это проблема с библиотечными хуками - видел это раньше. Однако это было не так - библиотека и ее функции работают, но оказалось, что Screen.get_default() вернул NULL.

Итак, это поведение описано в документации GDK:

gdk_screen_get_default ()

Возвращает: GdkScreen или NULL, если нет отображения по умолчанию.

Для меня он успешно возвращает объект GdkScreen при запуске с Python, но возвращает NULL в исполняемом файле PyInstaller.

Итак, почему отображение по умолчанию не определяется этой функцией в исполняемом файле и как заставить его работать?

PS: у меня есть аналогичный EXE-файл, созданный PyInstaller, который отлично работает в Windows, но он использует другую библиотеку для чтения данных экрана.


person XArgon    schedule 29.01.2016    source источник


Ответы (1)


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

# Get screen size for Linux
import gtk
def GetResolution():
    window = gtk.Window()
    screen = window.get_screen()
    width = gtk.gdk.screen_width()
    height = gtk.gdk.screen_height()
    return [width, height]

Работает как в скрипте Python, так и в исполняемом файле PyInstaller, проверено на 32-битной и 64-битной версии Linux Mint 17.3.

До сих пор не знаю, что вызвало проблему с библиотекой, которую я изначально использовал.

person XArgon    schedule 29.01.2016