2016-05-02 1 views
0

Я хочу ввести шестнадцатеричную цифру с нажатием клавиши или скопировать и вставить текст. Мой ввод показывает байты с пробелом. Когда введено «12345678», на текстовом контроле отображаются «12 34 56 78». Я перехожу к нему с событием EVT_TEXT. Но я не могу это разрешить.Как отобразить шестнадцатеричную строку с пробелом в текстовом контроле в wxpython?

+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