2016-07-28 182 views
0
import wx 

class Control(wx.Control): 

    def __init__(self, parent): 

     wx.Control.__init__(self, parent) 

     self.Bind(wx.EVT_CHAR, self.OnKey) 
     self.Bind(wx.EVT_KEY_DOWN, self.OnKey) 
     self.Bind(wx.EVT_KEY_DOWN, self.OnKey) 
     self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseClick) 

    def OnKey(self, event): 
     print("key pressed") 
     event.Skip() 

    def OnMouseClick(self, event): 
     self.SetFocus() 
     print("has focus") 
     event.Skip() 

class Frame(wx.Frame): 

    def __init__(self, parent=None): 

     wx.Frame.__init__(self, parent) 

     panel = wx.Panel(self) 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     radio = wx.RadioButton(panel, label="Radio button") 
     button = wx.Button(panel, label="Button") 
     control = Control(panel) 

     sizer.Add(radio, 0, wx.ALL, 5) 
     sizer.Add(button, 0, wx.ALL, 5) 
     sizer.Add(control, 0, wx.ALL, 5) 

     panel.SetSizer(sizer) 

     self.Show() 

if __name__ == "__main__": 
    app = wx.App() 
    frame = Frame() 
    app.MainLoop() 

一個非常簡單的例子。wxPython - 如何阻止wx.Control失去焦點在箭頭鍵按?

通過點擊控件,設置焦點來控制。但是,即使將按鍵綁定到一個函數OnKey,按下方向鍵將焦點更改爲另一個按鈕/小部件。

有沒有一種方法類似AcceptsFocusFromKeyboard(個體經營):

說明:可以在該窗口通過鍵盤導航給予重點是什麼?如果不是的話,唯一讓它專注的方法就是點擊它。

除此之外,

一種方法,在我的控制不從鍵盤導航

回答

0

你們倆的事件處理程序失去焦點缺少呼籲:

event.Skip() 

這些事件非wxCommandEvents,爲了使它們正常工作,OS必須執行任何需要執行的操作。這就是Skip()的用途。否則,該事件將被控制器吃掉。

請檢查該方法的文檔,添加它,看看是否解決了這個問題。

另外,出於好奇,當用戶按下箭頭鍵時,你會發生什麼?

如果您希望焦點在按下箭頭鍵時保持不變,請嘗試通過event.GetKeyCode()過濾事件(檢查文檔中正確的函數名稱)並且不要調用event.Skip()這個案例。

如果這不起作用,請嘗試捕獲wx.EVT_CHAR_HOOK事件。

如果即使這樣做不起作用,請重寫FilterEvent()。

另外,你的GUI結構很怪異。嘗試獲取RAD工具(wxGlade,wxSmith等),在那裏構建並查看結果。或者查看wxPython發行版中的演示文件夾(可作爲不同的下載)來查看如何在wxPython中製作正常的佈局。

也可以通過修復GUI來修復箭頭鍵問題。

試試這個代碼,而不是:

import wx 

class Frame(wx.Frame): 
    def __init__(self, parent=None): 
     wx.Frame.__init__(self, parent) 
     panel = wx.Panel(self) 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     radio = wx.RadioButton(panel, label="Radio button") 
     button = wx.Button(panel, label="Button") 
     self.Bind(wx.EVT_CHAR, self.OnChar) 
     radio.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     button.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseClick) 

     sizer.Add(radio, 0, wx.ALL, 5) 
     sizer.Add(button, 0, wx.ALL, 5) 
     sizer.Add(control, 0, wx.ALL, 5) 

     panel.SetSizer(sizer) 

     self.Show() 

    def OnKeyDown(self, event): 
     print("key pressed") 
     if not event.GetKeyPress() == wx.WXK_LEFT_ARROW: # Check the function name. I'm writing from memory 
      event.Skip() 

    def OnChar(self, event): 
     print("Character key pressed on the panel") 
     event.Skip() 

    def OnMouseClick(self, event): 
     self.SetFocus() 
     print("has focus") 
     event.Skip() 

if __name__ == "__main__": 
    app = wx.App() 
    frame = Frame() 
    app.MainLoop() 

你應該明白我的意思。只有當按下的鍵不是箭頭鍵時才調用event.Skip()。

+0

對不起,我沒有測試event.Skip(),但我沒有把它從例子中排除掉。我希望它能夠專注於控件,方向鍵可以改變控件的狀態。例如,像listctrl一樣,箭頭鍵可以更改列表中的選擇,而不是從listctrl中失去焦點。 – Blackboard

+0

@Blackboard,答案已更新。 – Igor

+0

謝謝,我會嘗試你所提出的建議。如果你不介意我問,代碼(不是指間距或命名約定等)對你來說看起來是錯誤還是奇怪?我已經看到了很多以這種方式構建的各種教程的代碼示例。(雖然我會檢查更多的代碼示例) – Blackboard