Выделение выделенной строки в не сфокусированном текстовом виджете Tkinter - PullRequest
2 голосов
/ 08 декабря 2011

Я бы хотел сосредоточиться на виджете ввода текста, который будет передавать все, что введено, в отдельный виджет отображения текста. У меня эта часть работает.

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

Вот пример кода, чтобы вы могли видеть, как он у меня до сих пор. У меня сейчас гораздо больше виджетов и кода в графическом интерфейсе, но я опубликовал только соответствующий код для своей проблемы:

from Tkinter import *

class GUI:
    def __init__(self,root):
        Window = Frame(root)
        self.OutWidget = Text(Window, state='disabled')
        self.InWidget = Text(Window,bg='black',bd=3,fg='white',exportselection=0,height=1,wrap=WORD,insertofftime=0,insertbackground="white")
        self.OutWidget.pack()
        self.InWidget.pack()
        Window.pack()
        self.InWidget.focus_set()
        self.OutWidget.bind("<Button 1>",self.Select)
        self.InWidget.bind("<Return>", self.Post)

    def Post(self,event):
        text = self.InWidget.get(1.0,2.0)
        self.InWidget.delete(1.0,2.0)
        self.OutWidget['state'] = ['normal']
        self.OutWidget.insert('end',text)
        self.OutWidget['state'] = ['disabled']
        return ("break")

    def Select(self,event):
        #highlight the CURRENT line
        #store a reference to the line
        #return focus to InWidget
        self.InWidget.focus()
        return ("break")

if __name__ == '__main__':
    root = Tk()
    App = GUI(root)
    root.mainloop()

1 Ответ

4 голосов
/ 08 декабря 2011

Вы можете получить индекс начала строки, по которой вы щелкнули, используя что-то вроде этого:

line_start = self.OutWidget.index("@%s,%s linestart" % (event.x, event.y))

Вы можете добавить выделение, применив к этой строке тег с чем-то вроде этого:

line_end = self.OutWidget.index("%s lineend" % line_start)
self.OutWidget.tag_remove("highlight", 1.0, "end")
self.OutWidget.tag_add("highlight", line_start, line_end)

Вы можете установить цвет для элемента с помощью тега «highlight» примерно так:

self.OutWidget.tag_configure("highlight", background="bisque")

Вы можете переместить фокус обратно в другое окно примерно так:

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