2012-11-28 16 views
0

我正在使用wxPython。我有一個wx.Dialog與一堆按鈕,也是wx.TextCtrl。每個按鈕都有一個wx.Button,並通過wx.EVT_BUTTON與它綁定。我按了幾個按鈕,他們做了他們的事情。然後我想打空間吧。有趣的是,我有一個標籤爲SPC的按鈕,它與空格鍵行爲相對應,作爲一個額外的便利。我想會出現以下情況:有沒有辦法覆蓋Windows上的wxPython中的空格鍵行爲?

  1. 你按下空格鍵按鈕,它識別出空格鍵事件(作品)
  2. 你按下鍵盤上的空格鍵,並識別出空格鍵事件

    a。您推動鍵盤上的空格鍵,重點在wx.TextCtrl ...(作品)

    b。你推一個wx.Button的鍵盤焦點上的空格鍵,因爲這 是你最後處理的事件和空格鍵事件被識別(問題)

我做:

self.typingWindow.Bind(wx.EVT_KEY_DOWN, self.popup) 
self.Bind(wx.EVT_KEY_DOWN, self.popup) 

第一行允許案例2a工作

第二行沒有效果,但我認爲它應該?我看到了this old link,它解決了完全相同的問題,並且似乎表示,像我的第二條代碼行這樣的事情將允許案例2b工作。無論如何,在情況2b中發生的事情是爲最後按下的按鈕生成命令事件。這應該是Windows的默認行爲。

所以我的問題是我的情況2b可以工作嗎?也就是說,即使焦點當前位於按下的最後一個按鈕上,我是否可以生成按下按鍵事件,而不是按下最後一個按鈕時的命令事件。

回答

1

在對話框級別綁定到wxEVT_KEY_DOWN不能工作,因爲對話框永遠不會得到這個事件,按鍵事件被髮送到聚焦窗口,對話框永遠不會,焦點總是在其中一個兒童。另請注意,與命令事件鍵事件不同,不是向上傳播窗口層次結構。

所以,你可以在處理每個按鈕水平這個事件,或使用特殊wxEVT_CHAR_HOOK事件,發送到頂層父,即對話,正是允許這種窗口全局鍵盤處理邏輯的。

請注意,無論如何,如果按Space鍵除了激活當前聚焦的按鈕之外的任何其他內容,都會讓用戶感到非常困惑,因爲這是人們慣用的常見行爲。所以我強烈建議避免這樣做。

+0

我想EVT_CHAR_HOOK正是我所希望的,謝謝。無論出於何種原因,我直覺地希望'進入'是那個按鈕來激活當前聚焦的按鈕,不知道我從哪裏得到的?我會考慮我的選擇。 – demongolem

0

您可能必須將按鍵事件綁定到每個單獨的按鈕,並檢查是否按下了空格按鈕。如果是這樣,請調用空格鍵按鈕事件調用的方法。否則,請忽略該事件。您可能可以使用wx.AcceleratorTable,但我不確定。

相關問題