2013-07-28 3 views
0

Прошу прощения, если это вопрос новичков, но я пишу программу PythonCard, и я хочу, чтобы она что-то делала, когда я нажимаю клавишу ввода изнутри TextBox. Мой код ниже:PythonCard не получает 'enter' KeyEvent в Windows

def on_SampleTextField_keyDown(self, event): 
    if event.keyCode == wx.WXK_RETURN: 
     doSomething() 
    else: 
     event.Skip() 

Это отлично работает на Linux, но когда я запускаю его на Windows, она просто действует как клавиша Tab будет. После поиска в Интернете я считаю, что Windows обрабатывает ключ ввода как навигационный ключ, и если бы я использовал только wxPython, мне нужно было бы установить стиль окна на wx.WANTS_CHARS. Я думаю, что это должно быть возможно в PythonCard, поскольку оно просто сидит поверх wxPython, но я не уверен. И если это, я не знаю, как это сделать! Поэтому, если у кого-нибудь есть идеи, пожалуйста, дайте мне знать!

ответ

0

В WxPython я был в состоянии использовать клавишу возврата при добавлении wx.TE_PROCESS_ENTER в стиль TextCtrl и связывание wx.EVT_TEXT_ENTER события, как описано here.
PythonCard не определяет это событие, и вы не можете вручную изменить стиль TextField, поскольку это свойство установлено в __init__(). Другой вариант, который работал для меня в wxPython, был привязан к событию wx.EVT_CHAR_HOOK, которое не требует установки определенного атрибута стиля во время инициализации. Вот почему я использовал этот подход, чтобы придумать несколько хакерское решение проблемы.

PythonCard определяет свои события в классе структур, как это:

class KeyPressEvent(KeyEvent):  
    name = 'keyPress' 
    binding = wx.EVT_CHAR 
    id = wx.wxEVT_CHAR 

Я использовал эту структуру в качестве шаблона для нового пользовательского события мой код выглядит примерно так:

from PythonCard import model 
from PythonCard.event import KeyEvent 
import PythonCard.components.textfield 

import wx 

class KeyPressHookEvent(KeyEvent):  
    name = 'keyPressHook' 
    binding = wx.EVT_CHAR_HOOK 
    id = wx.wxEVT_CHAR_HOOK 

# TextFieldEvents is a tuple so type juggling is needed to modify it 
PythonCard.components.textfield.TextFieldEvents = tuple(
     list(PythonCard.components.textfield.TextFieldEvents) + 
     [KeyPressHookEvent]) 

Тогда Я создаю свое приложение как обычно и определяю обработчик:

def on_keyPressHook(self, event): 
    if event.keyCode == wx.WXK_RETURN: 
     self.handle_return() 
    else: 
     event.Skip() 

Этот способ Я могу обрабатывать нажатие клавиши возврата в handle_return(). Это работает на Windows, но не в Cygwin, и, возможно, не на Linux. По крайней мере, в Cygwin приложение по-прежнему получает нажатие клавиши возврата в on_keyDown(), поэтому все, что вам нужно сделать, это скопировать содержимое on_keyPressHook() в эту функцию.

Смежные вопросы