Причина, по которой состояние disabled
не работает на Mac, заключается в том, что оно отключает привязку, которая придает фокус виджету. Без фокуса подсветка на Mac не отображается. Если вы установите состояние disabled
, но затем назначите привязку для <ButtonPress-1>
, чтобы явно установить фокус на отключенном текстовом виджете, вы можете выбрать и скопировать текст, и подсветка отобразится.
Что касается исчезновения курсора ... возможно, это то, что должно произойти. Курсор говорит пользователю «это где текст будет вставлен». Поскольку текст не будет вставлен, наличие этого визуального ключа может сбить пользователя с толку. Вместо этого, если бы это было действительно важно, вы могли бы вставить небольшое изображение, куда бы они ни щелкнули, для имитации курсора.
Чтобы ответить на ваш вопрос о том, действительно ли виджет использует методы insert
и delete
: методы реального базового виджета - это то, что используют привязки по умолчанию, поэтому их переопределение в подклассе не имеет никакого эффекта. Вам нужно будет повторить все привязки по умолчанию, чтобы это работало. Это выполнимо, но много работы.
К сожалению, это та область, где программирование в Tcl действительно блестяще, потому что вы можете просто отключить команды insert
и delete
виджета. Конечно, вы можете сделать это непосредственно в Tkinter, так как в конечном итоге он выполняет код tcl, чтобы выполнить все, но это потребует написания некоторого кода tcl, который не очень удачное решение с точки зрения кодера Python.
Я думаю, что лучшее решение - это использовать отключенное состояние, а затем добавить достаточно привязок, чтобы сделать то, что вы хотите.
Вот простой пример, который работает путем явной установки фокуса на нажатие кнопки мыши. С помощью этого кода я могу щелкнуть и провести пальцем, чтобы выбрать регион, или дважды или трижды щелкнуть, чтобы выбрать слова и строки:
import Tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.text = tk.Text(width=40, height=20)
self.text.bind("<1>", self.set_focus)
self.text.insert("end", "\n".join(dir(tk.Tk)))
self.text.configure(state="disabled")
self.text.pack(fill="both", expand=True)
def set_focus(self, event):
'''Explicitly set focus, so user can select and copy text'''
self.text.focus_set()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()