# Signály a zpětná volání (Python)

Vysvětlení signálů a zpětných volání v GTK+.
Sebastian Pölsterl
sebp@k-d-w.org 2011
Marta Maria Casetti
mmcasetti@gmail.com 2012

# Signály a zpětná volání

# Přehled

Podobně jako jiné nástrojové sady GUI, i GTK+ používá událostmi řízený model programování. Když uživatel nic nedělá, hoví si GTK+ v hlavní smyčce a čeká na vstup. Když uživatel provede nějakou činnost – řekněme, že klikne myší – tak se hlavní smyčka „probudí“ a doručí událost do GTK+.

Když událost obdrží widgety, nejčastěji vyšlou jeden nebo více signálů. Signály upozorní váš program, že „se něco zajímavého stalo“ tím, že vyvolají funkci, kterou jste na signál napojili. Tyto funkce jsou obecně známé jako zpětná volání. Jakmile je vaše zpětné volání vyvoláno, měli byste běžně něco udělat. Po dokončení zpětného volání se GTK+ vrátí do zpětné smyčky a čeká na další uživatelův vstup.

Obecný příklad: `handler_id = widget.connect("událost", zpětné_volání, data)`. `widget` je instance widgetu, který jsme vytvořili dříve. Následuje `událost`, která nás zajímá. Každý widget má své vlastní konkrétní události, které u něj mohou nastat. Například, když máte `Gtk.Button`, obvykle chcete napojit událost `"clicked"`: to znamená, že když je na tlačítko kliknuto, vyšle se signál. Jiným příkladem je signál `notify::property`: kdykoliv je u `GObject` změněna vlastnost, tak místo prostého vyslání signálu `notify`, přiřadí `GObject` tomuto signálu doplňující údaj v podobě názvu změněné vlastnosti. To umožňuje klientovi, který si přeje být upozorňován na změny jen u jedné vlastnosti, odfiltrovat většinu událostí dříve, než k němu dorazí. Zatřetí, argument `zpětné_volání` je název funkce zpětného volání, která obsahuje kód, co se má spustit při vyslání signálu zadaného typu. A nakonec, volitelný argument `data` obsahuje libovolná data, která by měla být předána při vyslání signálu.

Funkce vrací číslo (`handler_id`), které identifikuje tento konkrétní pár signál/zpětné volání. Toto číslo je požadováno při odpojení signálu v podobě `widget.disconnect(handler_id)`. Způsobí to, že takováto funkce zpětného volání již nebude nadále volána v budoucnu nebo při právě probíhajícím vysílání signálu, který byl na ni napojen.

# Odkazy

Signály v dokumentaci k GObject

Základy – Hlavní smyčka a signály ve výuce GTK+ 3 v jazyce Python