2017-01-05 20 views
0

Как я могу выделить весь текст, как блок, используя click + drug left mouse в виджере ввода tkinter python.CTRL + a выбрать все в входе виджет tkinter python

e1 = tk.Entry(bop, width = 50, font = "Helvetica 13") 
e1.grid(row=1,column=1, padx=15, pady=15) 
e1.bind_class("Entry","<Control-a>", select_all(e1)) 

здесь функция select_all():

def select_all(e): 
    a = e.select_range(0,tk.END) 
+0

'bind' ожидает имя функции (обратный вызов) - это означает без'() 'и аргументов. Вы можете создать функцию без аргументов, которая использует вашу функцию с аргементами, или использовать lambda: 'bind (..., lambda: select_all (e1))' – furas

+0

BTW: 'Entry' имеет метод' get() 'для получения всего текста. – furas

ответ

4

Существовал так много подобных примеров на SO

import tkinter as tk 

def callback(event): 
    print('e.get():', e.get()) 
    # or more universal 
    print('event.widget.get():', event.widget.get()) 
    # select text after 50ms 
    root.after(50, select_all, event.widget) 

def select_all(widget): 
    # select text 
    widget.select_range(0, 'end') 
    # move cursor to the end 
    widget.icursor('end') 

root = tk.Tk() 

e = tk.Entry(root) 
e.pack() 
e.bind('<Control-a>', callback) 

root.mainloop() 

bind ожидает имя файла без () и аргументов (обратного вызова). Но также bind выполняет эту функцию всегда с одним аргументом event, который дает доступ к записи, которая выполняет эту функцию event.widget, поэтому вы можете использовать ее со многими различными записями. И, наконец, Entry имеет .get(), чтобы получить весь текст.


РЕДАКТИРОВАТЬ:

Поскольку после освобождения ключи <Control-a> выбор будет удален поэтому я использую after(), чтобы выполнить выбор после того, как 50 мс. Он выбирает весь текст (но он перемещает курсор в начало) и перемещает курсор в конец. (См код выше)


EDIT:

Прежде чем я не мог найти правильное сочетание с Release, но он должен быть <Control-KeyRelease-a> и теперь она не нуждается в after()

import tkinter as tk 

def callback(event): 
    print('e.get():', e.get()) 
    # or more universal 
    print('event.widget.get():', event.widget.get()) 

    # select text 
    event.widget.select_range(0, 'end') 
    # move cursor to the end 
    event.widget.icursor('end') 

root = tk.Tk() 

e = tk.Entry(root) 
e.pack() 
e.bind('<Control-KeyRelease-a>', callback) 

root.mainloop() 
+0

Хотя ваш пример полезен, он не полностью отвечает на вопрос. Можете ли вы изменить свой метод обратного вызова, чтобы на самом деле выполнять функции «выбрать все»? –

+0

Я добавил рабочий 'select_all' (@BryanOakley) – furas

+0

Я нашел' ', и теперь ему не нужно' after() ' – furas