Обмен строк в текстовом виджете Tkinter - PullRequest
1 голос
/ 20 января 2012

У меня все настроено, я просто не могу понять, как поменять 2 строки в текстовом виджете Tkinter. Он отключен и заполняется другими виджетами, поэтому я дал отключенному / не сфокусированному текстовому виджету некоторую функциональность с 3 кнопками; Move_Up, Move_Down и Delete. У меня удалено рабочее, но я не могу понять, как заставить других двух работать. Сейчас я работаю с 2 значениями, которые ссылаются на начало и конец строки текста, которая будет изменена: self.line_start и self.line_end

А вот что у меня есть:

def Move_Up(self):
   self.TextWidg.config(state='normal')
   #swap this line with the line above it
   self.TextWidg.config(state='disabled')

def Move_Down(self):
   self.TextWidg.config(state='normal')
   #swap this line with the line below it
   self.TextWidg.config(state='disabled')

def Delete(self):
   self.TextWidg.config(state='normal')
   #delete the line
   self.TextWidg.delete(self.line_start,self.line_end)
   #delete the carriage return
   self.TextWidg.delete(self.line_start)
   self.TextWidg.config(state='disabled')

По сути, как бы я реализовал свои значения self.line_start и self.line_end, чтобы поменять местами строку со строкой до нее или строку после нее.

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Следуя советам Брайана, я смог решить методы Move_Up () и Move_Down () следующим образом. Он работает с использованием Python 3.1.3 или 2.6.6 в Mac OS X.

#swap this line with the line above it
def Move_Up():
    text.config(state='normal')
    # get text on current and previous lines
    lineText = text.get("insert linestart", "insert lineend")
    prevLineText = text.get("insert linestart -1 line", "insert -1 line lineend")

    # delete the old lines
    text.delete("insert linestart -1 line", "insert -1 line lineend")
    text.delete("insert linestart", "insert lineend")

    # insert lines in swapped order
    text.insert("insert linestart -1 line", lineText)
    text.insert("insert linestart", prevLineText)
    #text.config(state='disabled')


#swap this line with the line below it
def Move_Down():
    text.config(state='normal')
    # get text on current and next lines
    lineText = text.get("insert linestart", "insert lineend")
    nextLineText = text.get("insert +1 line linestart", "insert +1 line lineend")

    # delete text on current and next lines
    text.delete("insert linestart", "insert lineend")
    text.delete("insert +1 line linestart", "insert +1 line lineend")

    # insert text in swapped order
    text.insert("insert linestart", nextLineText) 
    text.insert("insert linestart + 1 line", lineText)
    #text.config(state='disabled')

РЕДАКТИРОВАТЬ: Обратите внимание, что при наличии только одной строки текста Move_Up() добавит этот текст к этой строке. И Move_Down() ничего не делает, если есть только одна строка.

1 голос
/ 20 января 2012

Вы можете получить индекс любой позиции в виджете с помощью метода index. Вы можете указать аргумент, включающий такие модификаторы, как linestart и lineend. Вы также можете получить индекс относительной позиции, например, +1c, чтобы получить индекс следующего символа, или +1l, чтобы получить следующую строку. Вы также можете использовать wordstart и wordend. Вы можете комбинировать их, например: index("insert lineend +1c")

Например, чтобы получить начало и конец строки, в которой есть курсор вставки (где «insert» - это имя метки, представляющей курсор вставки):

start = self.TextWidg("insert linestart")
end = self.TextWidg("insert lineend")

Для получения дополнительной информации см. Раздел «выражения» на странице текстового виджета на effbot.org .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...