Я хочу ввести шестнадцатеричную цифру с нажатием клавиши или скопировать и вставить текст. Мой ввод показывает байты с пробелом. Когда введено «12345678», на текстовом контроле отображаются «12 34 56 78». Я перехожу к нему с событием EVT_TEXT. Но я не могу это разрешить.Как отобразить шестнадцатеричную строку с пробелом в текстовом контроле в wxpython?
0
A
ответ
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
маске textctrl может быть то, что вы ищете, находится в wx.lib.masked. – Yoriz