2013-03-28 4 views
2

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

count = 0 
for ch in text: 
    if(ch == "\n"): 
     count += 1 
return count 

тот же текст переходит в элемент управления TextBox. Я бы хотел прокрутить до последней строки, но количество строк не поможет, потому что textBox обертывает длинные строки, делая их 2 или более строк.
Я могу перейти к последней строке, прокрутив до -1, но потом я больше не могу прокручивать. Мне нужно знать (фактическое) максимальное количество строк, чтобы я мог прокручивать любую позицию, которую я хочу.

lastLine = self.count_lines(text) 
self.getControl(100).setText(text) 
self.getControl(100).scroll(lastLine) 
+4

Для подсчета новой строки в заданной строке Python, 'LEN (text.splitlines()' будет проще. Или даже 'text.count ('\ п')'. –

+0

@MartijnPieters Но будет ли это дать me count, который учитывает реальное количество строк в текстовом поле, включая обернутые? – ilomambo

+0

@MartijnPieters - ваши два метода дают разные результаты. – eumiro

ответ

1

Вы сказали, что длинная линия разделена на 2 строки или больше, верно?

можно пересчитать строки таким образом

count=0 
for a in string.split(): 
    count+= 1+a//MaxLen 

где строка является текст, который вы имеете дело, и MaxLen максимальное количество символов, текстовое поле может показать в строке

, но это просто не решает проблему, если вы не знаете, как получить MaxLen, и я на самом деле не знаю ...

+1

спасибо Альберто. Кажется, эта проблема известна, и на данный момент она не разрешима. Команда XBMC не предвидела применения управления TextBox полностью, поскольку XBMC является первым и в основном ориентированным на медиа. – ilomambo

+0

+1 для попытки. Благодарю. – Geoff

0

Немного поздно, но только в случае, если кто-то другой может это использовать, вот мое решение. Этот пример будет динамически определять высоту виджета curses textpad.

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

# Purpose: Test Scrolling 
# 
# File test.py 
# Author: Dan Huckson 
# Date: 20150922 
# 

import curses 

def main(stdscr): 
    vpwidth = 1 
    vpheight = 30 
    string = "A\n BB\n CCC\n DDDD\n EEEEE\n  FFFFFF\n  GGGGGGG\n  HHHHHHHH\n  JJJJJJJJJ\n   KKKKKKKKKK\n   LLLLLLLLLLL\n   MMMMMMMMMMMM\n   NNNNNNNNNNNNN\n    OOOOOOOOOOOOOO END" 

    height = w = 0 
    stdscr.refresh() 
    for c in string: 
     if c == '\n' and not w: height += 1 
     else: 
      if c != '\n': 
       w += 1 
       if w < vpwidth: continue 
      elif w == vpwidth: height += 1 
      w = 0  
      height += 1 
    if w: height += 1 

    pad = curses.newpad(height+1, vpwidth) 
    pad.addstr(string) 

    top = 0 
    left = 3 
    offset = key = 0 
    while True: 
     if key == curses.KEY_UP and offset: offset -= 1 
     elif key == curses.KEY_DOWN and (offset + vpheight) < height: 
      offset += 1 

     pad.refresh(offset, 0, top, left, vpheight+top, vpwidth+left) 

     for i in range(vpheight): 
      stdscr.addstr(i,0, (' %s:' % i)[-3:]) 

     stdscr.addstr(vpheight,0, ' ----~----+----~----+----~----+----~----+----~----+----~----+----~----+----~----') 
     stdscr.addstr(vpheight+1,0, '   10  20  30  40  50  60  70  ') 
     stdscr.addstr(vpheight+2,0, '                    ') 
     stdscr.addstr(vpheight+4,0, '%s %s %s %s %s %s %s %s ' % (offset, 0, 0, 0, vpheight, vpwidth, height, len(string))) 

     key = stdscr.getch() 


curses.wrapper(main)