<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # PyGTK 中的事件和信號 > 原文: [http://zetcode.com/gui/pygtk/signals/](http://zetcode.com/gui/pygtk/signals/) 在 PyGTK 編程教程的這一部分中,我們將討論信號&事件。 所有 GUI 應用都是事件驅動的。 PyGTK 應用也不例外。 應用通過`gtk.main()`調用啟動主循環,該循環不斷檢查新生成的事件。 如果沒有事件,則應用將等待并且不執行任何操作。 事件是從 X 服務器到應用的消息。 當我們單擊按鈕小部件時,單擊的信號將以發出。 有所有小部件都繼承的信號,例如銷毀,有特定于小部件的信號,例如在切換按鈕上切換。 程序員使用信號處理器來響應各種信號。 這些處理器在 GTK 程序員中稱為回調。 ```py handler_id = button.connect("clicked", self.on_clicked) ``` 在這里,我們使用`GObject`類的`connect()`方法((`GtkButton`是`GObject`))將回調`on_clicked()`連接到名為`clicked`的信號。 `connect()`方法返回一個處理器 ID,用于唯一標識回調方法。 該 ID 可以與以下方法一起使用: ```py def disconnect(handler_id) def handler_disconnect(handler_id) def handler_is_connected(handler_id) def handler_block(handler_id) def handler_unblock(handler_id) ``` 這些方法使處理器可以與`GObject`斷開連接,也可以對其進行阻止/取消阻止。 ## 信號與事件 關于兩者之間的差異,通常會有很多困惑。 信號和事件是兩件事。 事件是窗口系統事件的幾乎一對一的映射。 按鍵,調整窗口大小或按鍵是典型的窗口系統事件。 窗口系統事件將報告給應用主循環。 Gdk 解釋窗口系統事件并通過信號傳遞它們。 信號就是回調機制。 如果一個對象希望收到有關另一對象的動作或狀態更改的通知,它將注冊一個回調。 當對象發出信號時,它會在已向其注冊的回調列表中查找并調用特定信號的回調。 它可以選擇發送一些預定義的數據。 信號是一個通用的通知框架。 它們不僅用于有關 UI 更改的通知。 它們可用于有關應用狀態更改的通知。 信號是通用的,有力的,其用途非常廣泛。 任何`GObject`都可以發射和接收信號。 一個類型可以具有一個或多個信號,每個信號可以具有一個參數列表和返回值。 然后可以將處理器連接到該類型的實例。 在實例上發出信號時,將調用每個連接的處理器。 信號和事件之間的唯一聯系是信號用于從 X 服務器發送有關事件的通知。 信號是`gtk.Object`及其子類的功能,事件是 Gdk/Xlib 概念。 ## 簡單的例子 下一個示例顯示了我們如何對兩個基本信號做出反應。 `quitbutton.py` ```py #!/usr/bin/python # ZetCode PyGTK tutorial # # The example shows how to work with # destroy and clicked signals # # author: jan bodnar # website: zetcode.com # last edited: February 2009 import gtk class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Quit Button") self.set_size_request(250, 200) self.set_position(gtk.WIN_POS_CENTER) self.connect("destroy", self.on_destroy) fixed = gtk.Fixed() quit = gtk.Button("Quit") quit.connect("clicked", self.on_clicked) quit.set_size_request(80, 35) fixed.put(quit, 50, 50) self.add(fixed) self.show_all() def on_destroy(self, widget): gtk.main_quit() def on_clicked(self, widget): gtk.main_quit() PyApp() gtk.main() ``` 當我們關閉窗口時,破壞信號被觸發。 默認情況下,當我們單擊標題欄中的關閉按鈕時,應用不會退出。 ```py self.connect("destroy", self.on_destroy) ``` `connect()`方法將`on_destroy()`方法插入`destroy`信號。 ```py quit.connect("clicked", self.on_clicked) ``` 按下退出按鈕,將觸發`clicked`信號。 當單擊退出按鈕時,我們將調用`on_clicked()`方法。 ```py def on_destroy(self, widget): gtk.main_quit() ``` 在`on_destroy()`方法中,我們對`destroy`信號做出反應。 我們調用`gtk.main_quit()`方法,該方法將終止應用。 ```py def on_clicked(self, widget): gtk.main_quit() ``` 這是`on_clicked()`方法。 它有兩個參數。 `widget`參數是觸發該信號的對象。 在我們的例子中,它是退出按鈕。 不同的對象發送不同的信號。 發送到方法的信號和參數可以在 PyGTK 庫的參考手冊中找到。 [pygtk.org/docs/pygtk/index.html](http://pygtk.org/docs/pygtk/index.html) ## 創建自定義信號 在下面的代碼示例中,我們創建并發送一個自定義信號。 `customsignal.py` ```py #!/usr/bin/python # ZetCode PyGTK tutorial # # This example shows how to create # and send a custom singal # # author: jan bodnar # website: zetcode.com # last edited: February 2009 import gobject class Sender(gobject.GObject): def __init__(self): self.__gobject_init__() gobject.type_register(Sender) gobject.signal_new("z_signal", Sender, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()) class Receiver(gobject.GObject): def __init__(self, sender): self.__gobject_init__() sender.connect('z_signal', self.report_signal) def report_signal(self, sender): print "Receiver reacts to z_signal" def user_callback(object): print "user callback reacts to z_signal" if __name__ == '__main__': sender = Sender() receiver = Receiver(sender) sender.connect("z_signal", user_callback) sender.emit("z_signal") ``` 我們創建兩個`GObjects`。 發送方和接收方對象。 發送方發出一個信號,該信號被接收方對象接收。 我們還會在信號中插入回調。 ```py class Sender(gobject.GObject): def __init__(self): self.__gobject_init__() ``` 這是一個發送者對象。 它是使用默認構造器創建的。 ```py gobject.type_register(Sender) gobject.signal_new("z_signal", Sender, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()) ``` 我們注冊一個新對象和一個新信號。 `signal_new()`函數為發件人對象注冊一個名為`z_signal`的信號。 `SIGNAL_RUN_FIRST`參數意味著接收信號的對象的默認處理器首先調用。 最后兩個參數是返回值類型和參數類型。 在我們的示例中,我們不返回任何值,也不發送任何參數。 ```py sender.connect('z_signal', self.report_signal) ``` 接收器監聽`z_signal`。 ```py sender = Sender() receiver = Receiver(sender) ``` 實例化發送者和接收者對象。 接收方將發送方作為參數,以便可以監聽其信號。 ```py sender.connect("z_signal", user_callback) ``` 在這里,我們將信號插入用戶回調。 ```py sender.emit("z_signal") ``` `z_signal`正在發射。 ```py class Sender(gobject.GObject): __gsignals__ = { 'z_signal': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), } def __init__(self): self.__gobject_init__() gobject.type_register(Sender) ``` 我們還可以使用`__gsignals__`類屬性來注冊新信號。 ## 預定義的信號處理器 PyGTK 中的對象可能具有預定義的信號處理器。 這些處理器以`do_*`開頭。 例如`do_expose()`,`do_show()`或`do_clicked()`。 `move.py` ```py #!/usr/bin/python # ZetCode PyGTK tutorial # # This example overrides predefined # do_configure_event() signal handler # # author: jan bodnar # website: zetcode.com # last edited: February 2009 import gtk import gobject class PyApp(gtk.Window): __gsignals__ = { "configure-event" : "override" } def __init__(self): super(PyApp, self).__init__() self.set_size_request(200, 150) self.set_position(gtk.WIN_POS_CENTER) self.connect("destroy", gtk.main_quit) self.show_all() def do_configure_event(self, event): title = "%s, %s" % (event.x, event.y) self.set_title(title) gtk.Window.do_configure_event(self, event) PyApp() gtk.main() ``` 當我們移動窗口或調整窗口大小時,X 服務器將發送配置事件。 然后將它們轉換為`configure-event`信號。 在我們的代碼示例中,我們在標題欄中顯示窗口左上角的 x,y 坐標。 我們可以簡單地將信號處理器連接到`configure-event`信號。 但是我們采取了不同的策略。 我們重寫默認的類處理器,在其中實現所需的邏輯。 ```py __gsignals__ = { "configure-event" : "override" } ``` 這表明我們將覆蓋默認的`on_configure_event()`方法。 ```py def do_configure_event(self, event): title = "%s, %s" % (event.x, event.y) self.set_title(title) gtk.Window.do_configure_event(self, event) ``` 在這里,我們將覆蓋預定義的`do_configure_event()`方法。 我們將窗口的 x,y 坐標設置為窗口的標題。 另請注意最后一行。 它顯式調用超類`do_configure_event()`方法。 這是因為它做了一些重要的工作。 嘗試對此行添加注釋以查看發生了什么。 調整窗口大小無法正常工作。 如果重寫默認處理器,則可能會或可能不會調用超類方法。 就我們而言,我們必須這樣做。 ![Configure signal](https://img.kancloud.cn/be/67/be67f1b64358bffdf65c756cab3a91d0_258x178.jpg) 圖:配置信號 ## 按鈕的信號 以下示例顯示了各種按鈕信號。 `buttonsignals.py` ```py #!/usr/bin/python # ZetCode PyGTK tutorial # # This program shows various signals # of a button widget # It emits a button-release-event which # triggers a released singal # # author: jan bodnar # website: zetcode.com # last edited: February 2009 import gtk class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Signals") self.set_size_request(250, 200) self.set_position(gtk.WIN_POS_CENTER) self.connect("destroy", gtk.main_quit) fixed = gtk.Fixed() self.quit = gtk.Button("Quit") self.quit.connect("pressed", self.on_pressed) self.quit.connect("released", self.on_released) self.quit.connect("clicked", self.on_clicked) self.quit.set_size_request(80, 35) fixed.put(self.quit, 50, 50) self.add(fixed) self.show_all() self.emit_signal() def emit_signal(self): event = gtk.gdk.Event(gtk.gdk.BUTTON_RELEASE) event.button = 1 event.window = self.quit.window event.send_event = True self.quit.emit("button-release-event", event) def on_clicked(self, widget): print "clicked" def on_released(self, widget): print "released" def on_pressed(self, widget): print "pressed" PyApp() gtk.main() ``` 一個按鈕不僅可以發出一種信號。 我們與其中三個一起工作。 `clicked`,`pressed`和`released`信號。 我們還展示了事件信號如何觸發另一個信號。 ```py self.quit.connect("pressed", self.on_pressed) self.quit.connect("released", self.on_released) self.quit.connect("clicked", self.on_clicked) ``` 我們為所有三個信號注冊回調。 ```py self.emit_signal() ``` 在應用啟動時,我們發出特定信號。 ```py def emit_signal(self): event = gtk.gdk.Event(gtk.gdk.BUTTON_RELEASE) event.button = 1 event.window = self.quit.window event.send_event = True self.quit.emit("button-release-event", event) ``` 我們發出`button-release-event`信號。 它以`Event`對象為參數。 應用啟動后,我們應該在控制臺窗口中看到`"released"`文本。 當我們點擊按鈕時,所有三個信號都被觸發。 ## 阻止事件處理器 我們可以阻止信號處理器。 下一個示例顯示了這一點。 `block.py` ```py #!/usr/bin/python # ZetCode PyGTK tutorial # # This example shows how to block/unblock # a signal handler # # author: jan bodnar # website: zetcode.com # last edited: February 2009 import gtk class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Blocking a callback") self.set_size_request(250, 180) self.set_position(gtk.WIN_POS_CENTER) fixed = gtk.Fixed() button = gtk.Button("Click") button.set_size_request(80, 35) self.id = button.connect("clicked", self.on_clicked) fixed.put(button, 30, 50) check = gtk.CheckButton("Connect") check.set_active(True) check.connect("clicked", self.toggle_blocking, button) fixed.put(check, 130, 50) self.connect("destroy", gtk.main_quit) self.add(fixed) self.show_all() def on_clicked(self, widget): print "clicked" def toggle_blocking(self, checkbox, button): if checkbox.get_active(): button.handler_unblock(self.id) else: button.handler_block(self.id) PyApp() gtk.main() ``` 在代碼示例中,我們有一個按鈕和一個復選框。 當我們單擊按鈕并且復選框處于活動狀態時,我們在控制臺中顯示`"clicked"`文本。 復選框從按鈕`clicked`信號中阻止/取消處理器方法。 ```py self.id = button.connect("clicked", self.on_clicked) ``` `connect()`方法返回處理器 ID。 此 ID 用于阻止和取消阻止處理器。 ```py def toggle_blocking(self, checkbox, button): if checkbox.get_active(): button.handler_unblock(self.id) else: button.handler_block(self.id) ``` 這些行使用適當的方法阻止和取消阻止回調。 ![blocking a callback](https://img.kancloud.cn/16/6c/166c3ffe3eebe50b3d73abd0e217d7f6_258x208.jpg) 圖:阻止回調 在 PyGTK 教程的這一章中,我們處理了信號。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看