Как бы вы создали «идеальный по пикселям» графический интерфейс для Linux? - PullRequest
7 голосов
/ 03 мая 2010

Я хотел бы создать графический интерфейс, где каждый пиксель находится под моим контролем (то есть, не используя стандартные виджеты, которые предоставляет что-то вроде GTK +). Renoise - хороший пример того, что я хочу произвести.

Является ли переход на уровень Xlib или XCB наилучшим способом или это возможно сделать с помощью высокоуровневых сред, таких как GTK + (возможно, даже PyGTK)? Должен ли я смотреть на Каир для рисунка?

Я бы хотел поработать на Python или Ruby, если это возможно, но C тоже подойдет.

Ответы [ 6 ]

7 голосов
/ 03 мая 2010

С помощью Clutter toolkit (или другого виджета / набора холстов) вы можете создать такой интерфейс. Я бы не советовал переходить на уровень Xlib / XCB или DrawingArea, потому что это потребовало бы реализации большей части универсальных функций, уже присутствующих в полотнах.

5 голосов
/ 24 мая 2010

В X есть одна проблема с этим подходом, которую вы, возможно, не приняли во внимание. Размер шрифта измеряется в точках (одна точка составляет 1/72 дюйма) и, таким образом, изменяется (в пикселях) в зависимости от разрешения и размера монитора. Текстовые строки также будут различаться по длине в зависимости от языка, поэтому на самом деле невозможно определить, насколько большими должны быть кнопки и тому подобное. Общие графические наборы инструментов для X разработаны с учетом этого. Кроме того, было бы просто написать свой собственный движок тем для GTK, который рисует все виджеты именно так, как вы хотите (используя Cairo [1] или GDK [2]), и заставлять ваше приложение всегда использовать эту тему. Возможно, ваше приложение также сможет установить размер шрифта по умолчанию (в точках) на основе DPI, чтобы всегда получать одинаковый размер в пикселях (и, конечно, не делать ваше приложение переводимым).

Существует как минимум пара графических интерфейсов, использующих этот идеальный по пикселям подход, основанный на SDL [3], например, AGAR [4], PicoGUI [5] и Guichan [6]. Большинство из них написаны на C ++, а некоторые на C, и, насколько я знаю, ни у одного из них нет привязок для Python или Ruby. Затем, используя SDL, вы можете иметь только одно окно верхнего уровня, что означает, что ваше приложение (или набор инструментов GUI, который вы используете) должны выполнять свое собственное управление окнами для различных диалогов и тому подобное. Но я думаю, это было то, что ты намеревался в любом случае.

[1] cairographics.org/
[2] library.gnome.org/devel/gdk/unstable/index.html
[3] www.libsdl.org/
[4] libagar.org/
[5] picogui.org/
[6] guichan.sourceforge.net/wiki/index.php/Main_Page

3 голосов
/ 03 мая 2010

Вы, вероятно, захотите что-то вроде pygame тогда.

1 голос
/ 04 мая 2010

Проще говоря, вам нужно что-то, что дает вам ограничивающий прямоугольник и свободное правление, чтобы рисовать в нем все, что вы захотите. Такие объекты обычно называют «холст». Я делал это раньше (в Ruby), используя класс FXCanvas, доступный через набор инструментов Fox , но есть и другие доступные (например, wxWidgets, но у меня нет личного опыта использования этого набора инструментов). 1003 *

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

1 голос
/ 04 мая 2010

http://www.oluyede.org/blog/writing-a-widget-using-cairo-and-pygtk-28/ показывает, как создать простой виджет с использованием PyGTK и Cairo.

1 голос
/ 03 мая 2010

GTK и PyGTK - вероятно, неправильные инструменты для использования. Это не невозможно, потому что все ваше приложение может быть одним большим gtk.DrawingArea (пример того, где это действительно имеет смысл: Горгулья ), но для любого сложного графического интерфейса вы бы сошли с ума.

...