<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之旅 廣告
                # wxPython 中的事件 > 原文: [http://zetcode.com/wxpython/events/](http://zetcode.com/wxpython/events/) 事件是每個 GUI 應用不可或缺的一部分。 所有 GUI 應用都是事件驅動的。 應用會對在其生命周期內生成的不同事件類型做出反應。 事件主要由應用的用戶生成。 但是它們也可以通過其他方式生成。 例如互聯網連接,窗口管理器或計時器。 因此,當我們調用`MainLoop()`方法時,我們的應用將等待事件生成。 當我們退出應用時,`MainLoop()`方法結束。 ## 定義 事件是來自底層框架(通常是 GUI 工具箱)的應用級信息。事件循環是一種程序結構,用于等待并調度器中的事件或消息。 事件循環反復查找要處理的事件。調度器是將事件映射到事件處理器的過程。 事件處理器是對事件做出反應的方法。 事件對象是與事件關聯的對象。 通常是一個窗口。事件類型是已生成的唯一事件。事件綁定器是將事件類型與事件處理器綁定在一起的對象。 ## wxPython `wx.EVT_MOVE`示例 在下面的示例中,我們對`wx.MoveEvent`事件做出反應。 當我們將窗口移到新位置時會生成該事件。 此事件的事件綁定器為`wx.EVT_MOVE`。 `simple_event.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This is a wx.MoveEvent event demostration. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): wx.StaticText(self, label='x:', pos=(10,10)) wx.StaticText(self, label='y:', pos=(10,30)) self.st1 = wx.StaticText(self, label='', pos=(30, 10)) self.st2 = wx.StaticText(self, label='', pos=(30, 30)) self.Bind(wx.EVT_MOVE, self.OnMove) self.SetSize((350, 250)) self.SetTitle('Move event') self.Centre() def OnMove(self, e): x, y = e.GetPosition() self.st1.SetLabel(str(x)) self.st2.SetLabel(str(y)) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 該示例顯示窗口的當前位置。 ```py self.Bind(wx.EVT_MOVE, self.OnMove) ``` 在這里,我們將`wx.EVT_MOVE`事件綁定器綁定到`OnMove()`方法。 ```py def OnMove(self, e): x, y = e.GetPosition() self.st1.SetLabel(str(x)) self.st2.SetLabel(str(y)) ``` `OnMove()`方法中的事件參數是特定于特定事件類型的對象。 在我們的例子中,它是`wx.MoveEvent`類的實例。 該對象保存有關事件的信息。 例如事件對象或窗口的位置。 在我們的例子中,事件對象是`wx.Frame`小部件。 我們可以通過調用事件的`GetPosition()`方法找出當前位置。 ![Move event](https://img.kancloud.cn/86/24/862477fc4638cd830c8a58d33e659bac_350x250.jpg) 圖:移動事件 ## wxPython 事件綁定 在 wxPython 中使用事件的三個??步驟是: * 標識事件綁定程序名稱:`wx.EVT_SIZE`,`wx.EVT_CLOSE`等。 * 創建一個事件處理器。 生成事件時將調用此方法。 * 將事件綁定到事件處理器。 在 wxPython 中,我們說將方法綁定到事件。 有時會使用單詞鉤子。 您可以通過調用`Bind()`方法來綁定事件。 該方法具有以下參數: ```py Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY) ``` `event`是`EVT*`對象之一。 它指定事件的類型。 `handler`是要調用的對象。 換句話說,它是程序員綁定到事件的一種方法。 當我們要區分相同事件類型和不同小部件時,使用`source`參數。 當我們有多個按鈕,菜單項等時,將使用`id`參數。`id`用于在它們之間進行區分。 當需要將處理器綁定到 ID 范圍時,例如`EVT_MENU_RANGE`,可以使用`id2`。 注意,方法`Bind()`在類`EvtHandler`中定義。 它是`wx.Window`繼承的類。 `wx.Window`是 wxPython 中大多數小部件的基類。 還有一個相反的過程。 如果要從事件中取消綁定方法,請調用`Unbind()`方法。 它具有與上述相同的參數。 ## 取消事件 有時我們需要停止處理事件。 為此,我們稱方法`Veto()`。 `event_veto.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- import wx """ ZetCode wxPython tutorial In this example we veto an event. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) self.SetTitle('Event veto') self.Centre() def OnCloseWindow(self, e): dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) ret = dial.ShowModal() if ret == wx.ID_YES: self.Destroy() else: e.Veto() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在我們的示例中,我們處理`wx.CloseEvent`。 當我們單擊標題欄上的 X 按鈕,按 `Alt + F4` 或從系統菜單中選擇關閉時,將稱為此事件。 在許多應用中,如果要進行一些更改,我們希望防止意外關閉窗口。 為此,我們必須綁定`wx.EVT_CLOSE`事件綁定器。 ```py dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) ret = dial.ShowModal() ``` 在處理關閉事件期間,我們顯示一個消息對話框。 ```py if ret == wx.ID_YES: self.Destroy() else: event.Veto() ``` 根據對話框的返回值,我們銷毀窗口或否決事件。 注意,要關閉窗口,我們必須調用`Destroy()`方法。 通過調用`Close()`方法,我們將陷入無盡的循環。 ## wxPython 事件傳播 事件有兩種類型:基本事件和命令事件。 它們的傳播方式不同。 事件傳播是事件從子窗口小部件到父窗口小部件和祖父窗口小部件的傳播。 基本事件不會傳播。 命令事件確實傳播。 例如,`wx.CloseEvent`是一個基本事件。 此事件傳播到父窗口小部件沒有任何意義。 默認情況下,在事件處理器中捕獲的事件停止傳播。 為了繼續傳播,我們調用`Skip()`方法。 `event_propagation.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial This example demonstrates event propagation. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class MyPanel(wx.Panel): def __init__(self, *args, **kw): super(MyPanel, self).__init__(*args, **kw) self.Bind(wx.EVT_BUTTON, self.OnButtonClicked) def OnButtonClicked(self, e): print('event reached panel class') e.Skip() class MyButton(wx.Button): def __init__(self, *args, **kw): super(MyButton, self).__init__(*args, **kw) self.Bind(wx.EVT_BUTTON, self.OnButtonClicked) def OnButtonClicked(self, e): print('event reached button class') e.Skip() class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): mpnl = MyPanel(self) MyButton(mpnl, label='Ok', pos=(15, 15)) self.Bind(wx.EVT_BUTTON, self.OnButtonClicked) self.SetTitle('Propagate event') self.Centre() def OnButtonClicked(self, e): print('event reached frame class') e.Skip() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在我們的示例中,面板上有一個按鈕。 面板放置在框架小部件中。 我們為所有小部件定義一個處理器。 ```py def OnButtonClicked(self, e): print('event reached button class') e.Skip() ``` 我們在自定義按鈕類中處理按鈕單擊事件。 `Skip()`方法將事件進一步傳播到面板類。 嘗試省略一些`Skip()`方法,看看會發生什么。 ## 窗口標識符 窗口標識符是在事件系統中唯一確定窗口標識的整數。 有三種創建窗口 ID 的方法。 * 讓系統自動創建一個 ID * 使用標準標識符 * 創建自己的 ID ```py wx.Button(parent, -1) wx.Button(parent, wx.ID_ANY) ``` 如果為 id 參數提供 -1 或`wx.ID_ANY`,則讓 wxPython 自動為我們創建一個 id。 自動創建的 ID 始終為負,而用戶指定的 ID 必須始終為正。 當我們不需要更改窗口小部件狀態時,通常使用此選項。 例如,靜態文本在應用的生命周期內將永遠不會更改。 如果需要,我們仍然可以獲取 ID。 有一種確定 ID 的方法`GetId()`。 `default_ids.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example we use automatic ids with wx.ID_ANY. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): pnl = wx.Panel(self) exitButton = wx.Button(pnl, wx.ID_ANY, 'Exit', (10, 10)) self.Bind(wx.EVT_BUTTON, self.OnExit, id=exitButton.GetId()) self.SetTitle("Automatic ids") self.Centre() def OnExit(self, event): self.Close() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在此示例中,我們不在乎實際的 ID 值。 ```py self.Bind(wx.EVT_BUTTON, self.OnExit, id=exitButton.GetId()) ``` 我們通過調用`GetId()`方法來獲取自動生成的 ID。 建議使用標準標識符。 標識符可以在某些平臺上提供一些標準的圖形或行為。 ## wxPython 標準 ID wxPython 包含一些標準 ID,例如`wx.ID_SAVE`或`wx.ID_NEW`。 `standard_ids.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example we create buttons with standard ids. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): pnl = wx.Panel(self) grid = wx.GridSizer(3, 2) grid.AddMany([(wx.Button(pnl, wx.ID_CANCEL), 0, wx.TOP | wx.LEFT, 9), (wx.Button(pnl, wx.ID_DELETE), 0, wx.TOP, 9), (wx.Button(pnl, wx.ID_SAVE), 0, wx.LEFT, 9), (wx.Button(pnl, wx.ID_EXIT)), (wx.Button(pnl, wx.ID_STOP), 0, wx.LEFT, 9), (wx.Button(pnl, wx.ID_NEW))]) self.Bind(wx.EVT_BUTTON, self.OnQuitApp, id=wx.ID_EXIT) pnl.SetSizer(grid) self.SetTitle("Standard ids") self.Centre() def OnQuitApp(self, event): self.Close() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在我們的示例中,我們在按鈕上使用標準標識符。 在 Linux 上,按鈕帶有圖標。 ```py grid.AddMany([(wx.Button(pnl, wx.ID_CANCEL), 0, wx.TOP | wx.LEFT, 9), (wx.Button(pnl, wx.ID_DELETE), 0, wx.TOP, 9), (wx.Button(pnl, wx.ID_SAVE), 0, wx.LEFT, 9), (wx.Button(pnl, wx.ID_EXIT)), (wx.Button(pnl, wx.ID_STOP), 0, wx.LEFT, 9), (wx.Button(pnl, wx.ID_NEW))]) ``` 我們向網格大小調整器添加六個按鈕。 `wx.ID_CANCEL`,`wx.ID_DELETE`,`wx.ID_SAVE`,`wx.ID_EXIT`,`wx.ID_STOP`和`wx.ID_NEW`是標準標識符。 ```py self.Bind(wx.EVT_BUTTON, self.OnQuitApp, id=wx.ID_EXIT) ``` 我們將按鈕單擊事件綁定到`OnQuitApp()`事件處理器。 `id`參數用于區分按鈕。 我們唯一地標識事件的來源。 ![Standard identifiers](https://img.kancloud.cn/81/cc/81ccf601b259910c31828c5ac80eaaa4_400x250.jpg) 圖:標準標識符 ## 自定義事件 ID 最后一個選擇是使用自己的標識符。 我們定義了自己的全局 ID。 `custom_ids.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example we use custom event ids. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx ID_MENU_NEW = wx.NewId() ID_MENU_OPEN = wx.NewId() ID_MENU_SAVE = wx.NewId() class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.CreateMenuBar() self.CreateStatusBar() self.SetSize((350, 250)) self.SetTitle('Custom ids') self.Centre() def CreateMenuBar(self): mb = wx.MenuBar() fMenu = wx.Menu() fMenu.Append(ID_MENU_NEW, 'New') fMenu.Append(ID_MENU_OPEN, 'Open') fMenu.Append(ID_MENU_SAVE, 'Save') mb.Append(fMenu, '&File') self.SetMenuBar(mb) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_NEW) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_OPEN) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_SAVE) def DisplayMessage(self, e): sb = self.GetStatusBar() eid = e.GetId() if eid == ID_MENU_NEW: msg = 'New menu item selected' elif eid == ID_MENU_OPEN: msg = 'Open menu item selected' elif eid == ID_MENU_SAVE: msg = 'Save menu item selected' sb.SetStatusText(msg) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在代碼示例中,我們創建一個包含三個菜單項的菜單。 此菜單項的 ID 是全局創建的。 ```py ID_MENU_NEW = wx.NewId() ID_MENU_OPEN = wx.NewId() ID_MENU_SAVE = wx.NewId() ``` `wx.NewId()`方法創建一個新的唯一 ID。 ```py self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_NEW) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_OPEN) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_SAVE) ``` 這三個菜單項均由其唯一 ID 標識。 ```py eid = e.GetId() if eid == ID_MENU_NEW: msg = 'New menu item selected' elif eid == ID_MENU_OPEN: msg = 'Open menu item selected' elif eid == ID_MENU_SAVE: msg = 'Save menu item selected' ``` 從事件對象中,我們檢索 ID。 根據 ID 值,我們準備消息,該消息顯示在應用的狀態欄中。 ## `wx.PaintEvent` 重繪窗口時會生成一次繪制事件。 當我們調整窗口大小或最大化窗口時,會發生這種情況。 繪圖事件也可以通過編程方式生成。 例如,當我們調用`SetLabel()`方法來更改`wx.StaticText`小部件時。 請注意,當我們最小化窗口時,不會生成任何繪制事件。 `paint_event.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example we count paint events. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): self.count = 0 self.Bind(wx.EVT_PAINT, self.OnPaint) self.SetTitle('Paint events') self.SetSize((350, 250)) self.Centre() def OnPaint(self, e): self.count += 1 dc = wx.PaintDC(self) text = "Number of paint events: {0}".format(self.count) dc.DrawText(text, 20, 20) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在我們的示例中,我們計算繪制事件的數量并在窗口上繪制當前生成的事件的數量。 ```py self.Bind(wx.EVT_PAINT, self.OnPaint) ``` 我們將`EVT_PAINT`事件綁定到`OnPaint()`方法。 ```py def OnPaint(self, e): self.count += 1 dc = wx.PaintDC(self) text = "Number of paint events: {0}".format(self.count) dc.DrawText(text, 20, 20) ``` 在`OnPaint()`事件內部,我們使用`DrawText()`方法增加了計數器繪制窗口上繪圖事件的數量。 ## `wx.FocusEvent` 焦點指示應用中當前選擇的窗口小部件。 從鍵盤輸入或從剪貼板粘貼的文本將發送到具有焦點的小部件。 有兩種與焦點有關的事件類型。 `wx.EVT_SET_FOCUS`事件,當窗口小部件獲得焦點時生成。 小部件失去焦點時,將生成`wx.EVT_KILL_FOCUS`。 通常,通過單擊或使用鍵盤鍵來更改焦點,通常是`選項卡`或 `Shift + 選項卡`。 `focus_event.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example we work with wx.FocusEvent. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class MyWindow(wx.Panel): def __init__(self, parent): super(MyWindow, self).__init__(parent) self.color = '#b3b3b3' self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen(self.color)) x, y = self.GetSize() dc.DrawRectangle(0, 0, x, y) def OnSize(self, e): self.Refresh() def OnSetFocus(self, e): self.color = '#ff0000' self.Refresh() def OnKillFocus(self, e): self.color = '#b3b3b3' self.Refresh() class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): grid = wx.GridSizer(2, 2, 10, 10) grid.AddMany([(MyWindow(self), 0, wx.EXPAND|wx.TOP|wx.LEFT, 9), (MyWindow(self), 0, wx.EXPAND|wx.TOP|wx.RIGHT, 9), (MyWindow(self), 0, wx.EXPAND|wx.BOTTOM|wx.LEFT, 9), (MyWindow(self), 0, wx.EXPAND|wx.BOTTOM|wx.RIGHT, 9)]) self.SetSizer(grid) self.SetSize((350, 250)) self.SetTitle('Focus event') self.Centre() def OnMove(self, e): print(e.GetEventObject()) x, y = e.GetPosition() self.st1.SetLabel(str(x)) self.st2.SetLabel(str(y)) def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在我們的示例中,我們有四個面板。 重點突出顯示的面板。 ```py self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus) self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) ``` 我們將兩個焦點事件綁定到事件處理器。 ```py def OnPaint(self, e): dc = wx.PaintDC(self) dc.SetPen(wx.Pen(self.color)) x, y = self.GetSize() dc.DrawRectangle(0, 0, x, y) ``` 在`OnPaint()`方法中,我們在窗口上繪制。 輪廓線的顏色取決于窗口是否具有焦點。 聚焦窗口的輪廓以紅色繪制。 ```py def OnSetFocus(self, e): self.color = '#ff0000' self.Refresh() ``` 在`OnSetFocus()`方法中,我們將`self.color`變量設置為紅色。 我們刷新框架窗口,這將為其所有子窗口小部件生成一個繪制事件。 重新繪制了窗口,焦點所在的窗口的輪廓線有了新的顏色。 ```py def OnKillFocus(self, e): self.color = '#b3b3b3' self.Refresh() ``` 當窗口失去焦點時,將調用`OnKillFocus()`方法。 我們更改顏色值并刷新。 ![Focus event](https://img.kancloud.cn/b8/66/b86671930f982411e06db2b6c6622ba7_350x250.jpg) 圖:焦點事件 ## `wx.KeyEvent` 當我們按下鍵盤上的一個鍵時,會生成一個`wx.KeyEvent`。 此事件發送到當前具有焦點的窗口小部件。 共有三種不同的按鍵處理器: * `wx.EVT_KEY_DOWN` * `wx.EVT_KEY_UP` * `wx.EVT_CHAR` 常見的請求是在按下 `Esc` 鍵時關閉應用。 `key_event.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example we work with wx.KeyEvent. author: Jan Bodnar website: www.zetcode.com last modified: April 2018 """ import wx class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): pnl = wx.Panel(self) pnl.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) pnl.SetFocus() self.SetSize((350, 250)) self.SetTitle('Key event') self.Centre() def OnKeyDown(self, e): key = e.GetKeyCode() if key == wx.WXK_ESCAPE: ret = wx.MessageBox('Are you sure to quit?', 'Question', wx.YES_NO | wx.NO_DEFAULT, self) if ret == wx.YES: self.Close() def main(): app = wx.App() ex = Example(None) ex.Show() app.MainLoop() if __name__ == '__main__': main() ``` 在此示例中,我們處理 `Esc` 按鍵。 顯示一個消息框,以確認應用的終止。 ```py pnl.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) ``` 我們將事件處理器綁定到`wx.EVT_KEY_DOWN`事件。 ```py key = e.GetKeyCode() ``` 在這里,我們獲得了按下的鍵的鍵控代碼。 ```py if key == wx.WXK_ESCAPE: ``` 我們檢查按鍵。 `Esc` 鍵具有`wx.WXK_ESCAPE`代碼。 在本章中,我們討論了 wxPython 中的事件。
                  <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>

                              哎呀哎呀视频在线观看