Найти - Пользователи
Полная версия: Tkinter копирование и вставка при использовании разных раскладок
Начало » GUI » Tkinter копирование и вставка при использовании разных раскладок
1
Guljaca
Проблема в том, что copy paste в Tk работает только под английской раскладкой.
Код ниже позволяет получать нажатие аналогичных кнопок на русской раскладке.
Теперь нужно как-то передать команду на копирование/вставку.
Работаю с текстом в TextWidget, выделенным курсором.
 import tkinter as tk
def copy(event):
    print('copy')
def paste(event):
    print('paste')
def test(event):    
    print('event.char:', event.char)
    print('event.keycode:', event.keycode)
    print('event.keysym:', event.keysym)
    print('---')
root = tk.Tk()
root.bind('<Key>', test)
root.bind('<ntilde>',            copy)
root.bind('<igrave>',           paste)
root.bind('<Control-Cyrillic_em>', paste)
root.mainloop(
)
PEHDOM
ну както так:
 import tkinter as tk
def copy(event):
    widget = event.widget
    try:
        start = widget.index("sel.first")
        end = widget.index("sel.last")
    except tk.TclError:
        pass
    else:
        widget.clipboard_clear()
        widget.clipboard_append(widget.get(start, end))
def paste(event):
    widget = event.widget
    try:
        start = widget.index("sel.first")
        end = widget.index("sel.last")
        widget.delete(start, end)
    except tk.TclError:
        pass
    clipboard = widget.clipboard_get()
    widget.insert("insert", clipboard)
root = tk.Tk()
text = tk.Text(root)
text.pack(side="bottom", fill="both", expand=True)
root.bind('<ntilde>', copy)
root.bind('<igrave>', paste)
root.bind('<Control-Cyrillic_em>', paste)
root.mainloop()
хотя такая реализация конечно выглядит некрасиво, лучше создать класс наследник виджета и там как методы класса описать копи\паст
 import tkinter as tk
class TextWidget(tk.Text):
    def __init__(self, *args, **kwargs):
        tk.Text.__init__(self, *args, **kwargs)
    def copy(self, event):
        try:
            start = self.index("sel.first")
            end = self.index("sel.last")
        except tk.TclError:
            pass
        else:
            self.clipboard_clear()
            self.clipboard_append(self.get(start, end))
    def paste(self, event):
        try:
            start = self.index("sel.first")
            end = self.index("sel.last")
            self.delete(start, end)
        except tk.TclError:
            pass
        clipboard = self.clipboard_get()
        self.insert("insert", clipboard)
root = tk.Tk()
text = TextWidget(root)
text.pack(side="bottom", fill="both", expand=True)
root.bind('<ntilde>', text.copy)
root.bind('<igrave>', text.paste)
root.bind('<Control-Cyrillic_em>', text.paste)
root.mainloop()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB