Хорошо, это будет шаг за шагом:
Наш виджет будет называться AwesomeTextView, модуль, в котором он находится, будет называться awesome_text_view. Это единственные имена, которые нам нужны.Виджет поляны состоит из двух частей: модуля и каталога.
Мы создаем каталог awesome_text_view.xml и (как root) сохраняем его в /usr/share/glade3/catalogs/. Это как это выглядит:<glade-catalog name="awesome_text_view"
library="gladepython"
domain="glade-3"
depends="gtk+">
<init-function>glade_python_init</init-function>
<glade-widget-classes>
<glade-widget-class title="Awesome TextView"
name="AwesomeTextView"
generic-name="awesome_text_view"/>
</glade-widget-classes>
<glade-widget-group name="python" title="Python">
<glade-widget-class-ref name="AwesomeTextView"/>
</glade-widget-group>
</glade-catalog>
Вы должны скопировать и адаптировать этот шаблон, поскольку он работает. :-) Мы создаем модуль awesome_text_view.py и (снова как root) сохраняем его на /usr/lib/glade3/modules/. Вот что это выглядит: import gobject
import gtk
import pango
class AwesomeTextView (gtk.TextView):
__gtype_name__ = 'AwesomeTextView'
def __init__(self):
gtk.TextView.__init__(self)
def set_font(self, font_description):
self.modify_font(pango.FontDescription(font_description))
Теперь он отображается в Glade, и вы можете добавить его в свое приложение. Наконец, вам просто нужно export PYTHONPATH="$PYTHONPATH:/usr/lib/glade3/modules/"
Вот и все!
Вот небольшое тестовое приложение, показывающее, как использовать ваш виджет:
import gtk
import awesome_text_view
class App (object):
builder = gtk.Builder()
def __init__(self):
self.builder.add_from_file("test.glade")
self.builder.connect_signals(self)
self.builder.get_object("awesome_text_view1").set_font("mono")
gtk.main()
def on_window1_destroy(self, widget):
gtk.main_quit()
App()
PREROUTING: эта цепочка используется для принятия любых связанных с маршрутизацией решений до (PRE) отправки любых пакетов. Всегда помните, что в таблице PREROUTING/POSTROUTING i.e. NAT цели ACCEPT/DROP/REJECT и т.д. таблицы по умолчанию FILTER не будут работать. Таблица NAT используется только для принятия решений о маршрутизации. Вы должны использовать PREROUTING при принятии любых решений о маршрутизации, то есть решениях, которые необходимо предпринять, прежде чем пакет начнет перемещаться по сети. Вот пример, мы перенаправляем любой трафик, который только что достиг сервера на порт 80, на порт 8080:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
PREROUTING : Как следует из названия, The FORWARD Цепочка таблицы FILTER используется для пересылки пакетов из источника в пункт назначения, здесь источник и получатель - это два разных хоста. Итак, как вы можете себе представить, правила FORWARD в основном используются на серверах, где один хост отправляет / получает трафик с другого хоста через сервер. Когда пакет генерируется с сервера, цепочка является OUTPUT, то есть трафик выходит из себя, тогда как цепочка INPUT означает, что пакеты предназначены только для самого сервера. Вот пример цепочки FORWARD, где любой TCP трафик, полученный на порту 80 на интерфейсе eth0, предназначенный для хоста 192.168.0.4, будет принят и отправлен на 192.168.0.4:
iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 192.168.0.4 -j ACCEPT