#python #gtk #pygtk #sdl #pygame
Вопрос:
Каков лучший способ использования PyGame (SDL) в приложении PyGTK?
Я ищу метод, который позволяет мне иметь область рисования в окне GTK и в то же время управлять событиями GTK и SDL.
Ответ №1:
Я сам никогда не пробовал, но, много слыша о других людях, которые пытались, это не та дорога, по которой вы хотите идти.
Существует альтернатива помещению графического интерфейса в саму pygame. Существует множество графических наборов инструментов, созданных специально для pygame, которые вы могли бы использовать. Большинство из них довольно незавершены, но есть 2 больших, активно обслуживаемых: PGU и OcempGUI. Полный список на сайте pygame находится здесь.
Ответ №2:
Возможно, вас заинтересует эта тема сообщения. Похоже, они не рекомендуют этого делать.
Ответ №3:
PyGame работает намного лучше, когда он может управлять своим собственным окном или, что еще лучше, использовать весь экран. GTK имеет достаточно гибкие виджеты, позволяющие создавать область рисования.
Однако эта страница может помочь, если вы хотите попробовать.
Ответ №4:
http://faq.pygtk.org/index.py?file=faq23.042.htpamp;req=show упоминает все это:
Вам нужно создать область рисования и задать переменную среды SDL_WINDOWID после ее реализации:
импорт ОС импорт gobject импорт gtk импорт pygame ВИНКС = 400 ВИНИ = 200 окно = gtk.Окно() window.connect("удалить событие", gtk.main_quit) window.set_resizable(False) площадь = gtk.Рисование области() area.set_app_paintable(True) area.set_size_request(ВИНКС, ВИНИ) окно.добавить(область) область.осознайте() # Заставьте SDL писать в нашей области рисования os.putenv('SDL_WINDOWID', str(area.window.xid)) # Нам нужно очистить цикл событий XLib, иначе мы не сможем # доступ к окну X, для которого set_mode() требуется gtk.gdk.flush() pygame.init() pygame.display.set_mode((ВИНКС, ВИНИ), 0, 0) экран = pygame.display.get_surface() image_surface = pygame.image.load('foo.png') screen.blit(поверхность изображения, (0, 0)) gobject.idle_add(pygame.дисплей.обновление) window.show_all() в то время как gtk.event_pending(): # обработка событий pygame/SDL идет здесь gtk.main_iteration(Ложь)
Ответ №5:
Я пытался сделать это сам некоторое время назад, и у меня никогда не получалось, чтобы это работало идеально. На самом деле я вообще не заставлял его работать под Windows, так как он продолжал ломать всю операционную систему, и у меня кончилось терпение. Я продолжал использовать его, хотя, поскольку это было важно, он работал только на Linux и был всего лишь небольшим проектом. Я настоятельно рекомендую вам изучить альтернативные варианты. Это всегда казалось отвратительным хак, и я чувствовал себя грязным.
Ответ №6:
Есть простое решение, которое может сработать для вас.
Напишите материалы PyGTK и PyGame как отдельные приложения. Затем из приложения PyGTK вызовите приложение PyGame, используя os.system для вызова приложения PyGame. Если вам нужно обмениваться данными между ними, используйте базу данных, каналы или IPC.
Ответ №7:
Проект Sugar включает в себя несколько видов деятельности, построенных с помощью PyGTK и PyGame.
Для этого они написали либ поддержки под названием Sugargame. Вы должны иметь возможность изменять его для обычных приложений PyGTK вместо сахара.
Вот глава в книге развития Шугар о том, как ее использовать.
Библиотека lib позволяет передавать события между GTK и PyGame.
Наслаждайтесь!