Как лучше всего использовать PyGame (SDL) в приложении PyGTK?
Я ищу метод, который позволяет мне иметь область рисования в окне GTK и в то же время иметь возможность управлять событиями GTK и SDL.
Как лучше всего использовать PyGame (SDL) в приложении PyGTK?
Я ищу метод, который позволяет мне иметь область рисования в окне GTK и в то же время иметь возможность управлять событиями GTK и SDL.
Я никогда не пробовал это делать сам, но много слышал о других людях, которые пробовали, и это не та дорога, по которой хочется идти.
Существует альтернатива размещению графического интерфейса в самом pygame. Существует множество наборов инструментов графического интерфейса, созданных специально для pygame, которые вы могли бы использовать. Большинство из них незакончены, но есть 2 больших, активно поддерживаемых: PGU и OcempGUI. Полный список на сайте pygame находится здесь.
Вас может заинтересовать эта ветка сообщений. Похоже, они рекомендуют против этого.
PyGame работает намного лучше, когда может управлять своим окном или, что еще лучше, использовать весь экран. GTK имеет достаточно гибких виджетов, позволяющих создавать область рисования.
Эта страница может помочь, если вы хотите попробовать.
http://faq.pygtk.org/index.py?file=faq23.042.htp&req=show упоминает все это:
Вам нужно создать область рисования и установить переменную среды SDL_WINDOWID после того, как она реализована:
import os import gobject import gtk import pygame WINX = 400 WINY = 200 window = gtk.Window() window.connect('delete-event', gtk.main_quit) window.set_resizable(False) area = gtk.DrawingArea() area.set_app_paintable(True) area.set_size_request(WINX, WINY) window.add(area) area.realize() # Force SDL to write on our drawing area os.putenv('SDL_WINDOWID', str(area.window.xid)) # We need to flush the XLib event loop otherwise we can't # access the XWindow which set_mode() requires gtk.gdk.flush() pygame.init() pygame.display.set_mode((WINX, WINY), 0, 0) screen = pygame.display.get_surface() image_surface = pygame.image.load('foo.png') screen.blit(image_surface, (0, 0)) gobject.idle_add(pygame.display.update) window.show_all() while gtk.event_pending(): # pygame/SDL event processing goes here gtk.main_iteration(False)
Я пытался сделать это сам некоторое время назад, и у меня никогда не получалось, чтобы это работало идеально. На самом деле, я вообще никогда не заставлял его работать под Windows, так как он постоянно давал сбой всей ОС, и у меня кончилось терпение. Я продолжал использовать его, хотя важно было только то, что он работал на Linux и был всего лишь небольшим проектом. Я настоятельно рекомендую вам исследовать альтернативы. Это всегда было похоже на неприятный взлом, и я чувствовал себя грязным.
Есть простое решение, которое может сработать для вас.
Напишите материалы PyGTK и PyGame как отдельные приложения. Затем из приложения PyGTK вызовите приложение PyGame, используя os.system для вызова приложения PyGame. Если вам нужно обмениваться данными между ними, используйте базу данных, каналы или IPC.
В проекте Sugar есть несколько Activity, созданных с помощью PyGTK и PyGame.
Для этого они написали библиотеку поддержки, которая называется Sugargame. Вы должны иметь возможность изменить его для обычных приложений PyGTK вместо Sugar.
Вот глава в книге разработчиков Sugar о том, как его использовать.
Библиотека позволяет обмениваться событиями между GTK и PyGame.
Наслаждаться!