2016-05-02 5 views
0

キーストロークで16進数を入力するか、テキストコントロールにコピーアンドペーストしたいと思います。 私の入力はスペースで表示されます。 「12345678」と入力すると、テキストコントロールに「12 34 56 78」と表示されます。 私はEVT_TEXTイベントでそれに挑戦しています。 しかし、私はそれを解決することはできません。wxpythonのテキストコントロールにスペースを含む16進数文字列を表示するにはどうすればいいですか?

+0

マスクされたtextctrlはあなたがwx.lib.maskedに位置、探しているものかもしれません。 – Yoriz

答えて

1

更新:次の実装があります。進むべき道は、EVT_KEY_DOWNを処理するためにある、代わりにEVT_TEXTのそれが役に立てば幸い:

# -*- coding: utf-8 -*- 
import re 
import wx 

########################################################################### 
## Display hex digit string with space on text control in wxpython; 
## input hex digit with key stroke or copy and paste on text control 
########################################################################### 

class MyFrame1 (wx.Frame):  
    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = "INPUT DEMO", pos = wx.DefaultPosition, size = wx.Size(200,150), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 
     self.m_panel1 = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) 
     self.m_staticText1 = wx.StaticText(self.m_panel1, wx.ID_ANY, u"HEX STRING", (-1, 10), wx.DefaultSize, 0) 
     self.m_textCtrl1 = wx.TextCtrl(self.m_panel1, wx.ID_ANY, wx.EmptyString, (-1, 30), wx.Size(190, -1), 0) 
     self.Layout()  
     self.Centre(wx.BOTH) 

     # Connect Events 
     self.m_textCtrl1.Bind(wx.EVT_KEY_DOWN, self.onKeyPress) 
     # Disable right-click menu (optional) 
     self.m_textCtrl1.Bind(wx.EVT_CONTEXT_MENU, self.skip) 
     self.Show() 

    def skip(self, event): 
     """ 
     Disable right click menu popup 
     """ 
     pass 

    # Virtual event handlers, overide them in your derived class 
    def onKeyPress(self, event): 
     """ 
     Key press event handler 
     """ 
     keycode = event.GetKeyCode() 

     if event.ControlDown() and keycode == 67: 
      # ctrl + c pressed 
      clipdata = wx.TextDataObject() 
      text_string = self.m_textCtrl1.GetValue() 
      clipdata.SetText(text_string) 
      wx.TheClipboard.Open() 
      wx.TheClipboard.SetData(clipdata) 
      wx.TheClipboard.Close() 

     elif event.ControlDown() and keycode == 86: 
      # ctrl + v pressed 
      self.paste() 

     elif 48<= keycode <= 57 or 324<= keycode <= 333: 
      self.justify() 
      event.Skip() 

     elif 65 <= keycode <= 70: # or 97 <= keycode <= 102:    
      self.justify() 
      self.m_textCtrl1.AppendText(chr(keycode)) 
      self.justify() 

     # When backspace, Del,<- and -> Pressed 
     elif event.GetKeyCode() in [ 8, 127, 314, 316 ]: 
      event.Skip()    

    def justify(self): 
     """ 
     Fill space to typed string if required 
     """ 
     curPos = self.m_textCtrl1.GetInsertionPoint()   
     self.m_textCtrl1.AppendText(" " * ((curPos + 1)%3 == 0)) 

    def paste(self): 
     """ 
     Paste Hex string from clipboard 
     """ 
     if not wx.TheClipboard.IsOpened(): # may crash, otherwise 
      do = wx.TextDataObject() 
      wx.TheClipboard.Open() 
      success = wx.TheClipboard.GetData(do) 
      wx.TheClipboard.Close() 
      if success: 
       s = re.sub('[^\da-fA-F]+', '', do.GetText()) 
       if s: 
        toPaste = " ".join(s[i:i+2] for i in range(0, len(s), 2)) 
        self.m_textCtrl1.SetValue(toPaste.upper()) 
        self.justify() 
        self.m_textCtrl1.SetInsertionPointEnd() 

if __name__ == '__main__': 
    app = wx.App() 
    frame = MyFrame1(None) 
    app.MainLoop() 
+0

あなたのコードをありがとう。あなたのコードをテストしました。それは正しく動作します – user1395438

関連する問題