Zachowanie kursora przy używaniu "do_backspace" i "del"

0

Witam

Chcę przejąć kontrolę nad backspace i del (poprzez przejęcie funkcji do_backspace) w TextInput, ale napotkałem dziwne i niezrozumiałe dla mnie zachowanie, gdy używam klawisza delete. Gdy backspace nie przesuwa kursora to delete już tak i to w prawo. Mimo, że znak nie jest usuwany. Walczę z tym wywołując do_cursor_movement('cursor_left'), ale też używam śledzenia kursora bind i dodatkowy ruch wywołuje niepotrzebną akcję bo jednak ten kursor rusza się niepotrzebnie.

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

from kivy.app import runTouchApp
from kivy.clock import Clock
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout

def crsFoll(*d):
	print('Cursor')
	return None

class MyTextInput(TextInput):
	def do_backspace(self, mode = None):
		if mode == 'del':
			print('delete')
			self.do_cursor_movement('cursor_left')
		else: print('backspace')
		return None

koLay = FloatLayout(size_hint = (1,1))

sLn = 'dfgfdfdgfd gf gfd g'
koTxt = MyTextInput(size_hint = (1,.2), text = sLn, font_size = 16, multiline = False)
koTxt.focus  = True
koLay.add_widget(koTxt)

Clock.schedule_once(lambda _: setattr(koTxt, 'cursor',(5,0)), .02 )
Clock.schedule_once(lambda _: koTxt.bind(cursor=crsFoll), .05)

runTouchApp(koLay)

quit()

Czy to jakiś błąd czy niezrozumiały dla mnie "feature"?

Pozdrawiam
Radek Głębicki

1

Wygląda na to, że funkcja _key_down implementuje obsługę delete poprzez przesunięcie kursora w prawo i wykonanie backspace (tutaj), pewno by nie implementować tego samego dwa razy.

Proponowałbym zatem przechwycić klawisz wcześniej w keyboard_on_key_down:

class MyTextInput(TextInput):
    def keyboard_on_key_down(self, window, keycode, text, modifiers):
        _, key = keycode
        if key in ('delete', 'backspace'):
            # do your stuff
            return
        return super().keyboard_on_key_down(window, keycode, text, modifiers)
0

Wielkie dzięki, działa świetnie. Zapytanie o forum. Jak generować te 'przyciski' jak w Twojej odpowiedzi? 'delete' i 'backspace'.

1

W edytorze postów masz przycisk, który wygląda jak klawiatura komputerowa — jak go klikniesz, to wstawi on wokół zaznaczonego tekstu tagi <kbd>zaznaczony tekst</kbd>. Możesz, oczywiście, też je wpisać ręcznie.

1
Althorion napisał(a):

W edytorze postów masz przycisk, który wygląda jak klawiatura komputerowa — jak go klikniesz, to wstawi on wokół zaznaczonego tekstu tagi <kbd>zaznaczony tekst</kbd>. Możesz, oczywiście, też je wpisać ręcznie.

  • Dodatkowo w edytorze można użyć skrótu Alt+K, który również dodaje <kbd>|</kbd>.
  • Co więcej, możesz napisać jakiś klawisz, zaznaczyć go i użyć skrótu Alt+K (lub kontrolki), by otoczyć go znacznikami <kbd>.
  • Jeśli kursor jest w znaczniku <kbd>, wciśnięcie Tab przenosi kursor poza znacznik, by kontynuować pisanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1