Как очистить поле entry в tkinter
Перейти к содержимому

Как очистить поле entry в tkinter

  • автор:

Как очистить поле entry в tkinter

Элемент Entry представляет поле для ввода текста. С помощью конструктора Entry можно установить ряд параметров, основные из них:

  • background : фоновый цвет
  • cursor : курсор указателя мыши при наведении на текстовое поле
  • foreground : цвет текста
  • font : шрифт текста
  • justify : устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER — по центру, RIGHT — по правому краю
  • show : задает маску для вводимых символов
  • state : состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
  • textvariable : устанавливает привязку к элементу StringVar
  • width : ширина элемента

Элемент Entry имеет ряд методов. Основные из них:

  • insert(index, str) : вставляет в текстовое поле строку по определенному индексу
  • get() : возвращает введенный в текстовое поле текст
  • delete(first, last=None) : удаляет символ по индексу first. Если указан параметр last, то удаление производится до индекса last. Чтобы удалить до конца, в качестве второго параметра можно использовать значение END.
  • focus() : установить фокус на текстовое поле

Простейшее текстовое поле:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") ttk.Entry().pack(anchor=NW, padx=8, pady= 8) root.mainloop()

текстовое поле ввода Entry в tkinter и python

Получение введенного текста

Для получения текста из Entry, можно использовать его метод get() . Так, определим элемент Entry и по нажатию на кнопку выведем введенный текст на текстовую метку:

from tkinter import * from tkinter import ttk def show_message(): label["text"] = entry.get() # получаем введенный текст root = Tk() root.title("METANIT.COM") root.geometry("250x200") entry = ttk.Entry() entry.pack(anchor=NW, padx=6, pady=6) btn = ttk.Button(text="Click", command=show_message) btn.pack(anchor=NW, padx=6, pady=6) label = ttk.Label() label.pack(anchor=NW, padx=6, pady=6) root.mainloop()

получение текста из текстового поля Entry в tkinter в Python

Вставка и удаление текста

Рассмотрим вставку и удаление текста в Entry:

from tkinter import * from tkinter import ttk def clear(): entry.delete(0, END) # удаление введенного текста def display(): label["text"] = entry.get() # получение введенного текста root = Tk() root.title("METANIT.COM") root.geometry("250x150") label = ttk.Label() label.pack(anchor=NW, padx=6, pady=6) entry = ttk.Entry() entry.pack(anchor=NW, padx=6, pady=6) # вставка начальных данных entry.insert(0, "Hello World") display_button = ttk.Button(text="Display", command=display) display_button.pack(side=LEFT, anchor=N, padx=6, pady=6) clear_button = ttk.Button(text="Clear", command=clear) clear_button.pack(side=LEFT, anchor=N, padx=6, pady=6) root.mainloop()

При запуске программы в текстовое поле сразу же добавляется текст по умолчанию:

entry.insert(0, "Hello World")

Кнопка Clear очищает оба поля, вызывая метод delete:

def clear(): entry.delete(0, END)

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

def display(): label["text"] = entry.get()

Валидация

С помощью параметра validate конструктора Entry можно задать, когда проводить валидацию введенного значения. Этот параметр может принимать следующие значения:

  • none : отсутствие валидации, значение по умолчанию
  • focus : валидация при получении фокуса
  • focusin : валидация при изменении фокуса
  • focusout : валидация при потере фокуса
  • key : валидация при каждом вводе нового символа
  • all : валидация при измении фокуса и вводе символов в поле

Параметр validatecommand позволяет установить команду валидации.

Рассмотрим небольшой пример. Допустим, пользовтаель должен ввести номер телефона в формете +xxxxxxxxxxx. То есть сначала должен идти знак +, а затем 11 цифр, например, +12345678901:

from tkinter import * from tkinter import ttk import re def is_valid(newval): return re.match("^\+\d$", newval) is not None root = Tk() root.title("METANIT.COM") root.geometry("250x200") check = (root.register(is_valid), "%P") phone_entry = ttk.Entry(validate="key", validatecommand=check) phone_entry.pack(padx=5, pady=5, anchor=NW) root.mainloop()

Итак, параметр validate=»key» указывает, что мы будем валидировать ввод при каждом нажати на клавиатуру. Параметр validatecommand=check говорит, что валидировать ввод будет команда «check». Эта команда представляет кортеж из двух элементов:

check = (root.register(is_valid), "%P")

Первый элемент — вызов метода root.register(is_valid) регистрирует функцию, которая собственно будет производить валидацию — это функция is_valid() . Второй элемент — подстановка «%P» представляет новое значение, которое передается в функцию валидации.

Собственно саму валидацию выполняет функция is_valid() . Она принимает один параметр — текущее значение Entry, которое надо валидировать. Она возвращает True, если значение прошло валидацию, и False, если не прошло. Сама логика валидации представляет проверку строки на регулярное выражение «^\+\d*$» . Если новое значение соответствует этому выражению, и в нем не больше 12 символов, то оно прошло валидацию.

В итоге мы сможем ввести в текстовое поле только символ + и затем только 11 цифр.

Валидация ввода в entry на tkinter в Python

Теперь немного изменим код и добавим вывод ошибок валидации:

from tkinter import * from tkinter import ttk import re def is_valid(newval): result= re.match("^\+\d$", newval) is not None if not result and len(newval) 

Здесь для вывода ошибок валидации добавлен виджет Label. Если введенное значение не соответствует регулярному выражению (например, пользователь попытался ввести нецифровой символ), и длина ввода меньше и равно 12 символов (проверять ввод больше 12 символов нет смысла, так как номер телефона содержит только 12 символов), то в метке выводим сообщение об ошибке

Валидация ввода в entry и вывод сообщения об ошибке в tkinter в Python

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

check = (root.register(is_valid), "%P", "%V")

Здесь значение "%V" представляет событие, которое вызывает валидацию (focus/focusin/focusout/key). Тогда в функции валидации с помощью второго параметра мы сможем получить это значение:

def is_valid(newval, op): result= re.match("^\+\d$", newval) is not None if op=="key": # некоторые действия elif op=="focus": # некоторые действия return result

Как очистить поле ввода в Tkinter?

Здравствуйте, нужна помощь. Изучаю Python и решил написать небольшую программу, чтобы немного разобраться во всем.

  1. Получать данные от пользователя и вносить их в файл.
  2. При запросе пользователя прочитать файл и вывести данные в табличном виде.
  3. Удалить ненужные данные (ошибка или потеря актуальности).

Изначально попробовал написать чисто консольный скрипт, теперь хочу добавить немного "красивостей". Использую для этого Tkinter.

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

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

Почитал про то, как можно очистить поле ввода, перепробовал несколько вариантов, но не один не сработал. Кто может подсказать как это исправить?

Если будут какие-то замечания по коду, пишите в комментариях.

from tkinter import * from tkinter import messagebox import pandas as pd import os def clear (): NameUserEntry.delete("0", END) NumbersEntry.delete("0", END) CarEntry.delete("0", END) VolumeSEntry.delete("0", END) PriceSEntry.delete("0", END) VolumeFEntry.delete("0", END) PriceFEntry.delete("0", END) ExpensesEntry.delete("0", END) def data_user(): os.system('CLS') print("Получение данных. ", end="") name_driver = NameUserEntry.get() number_driver = NumbersEntry.get() car_driver = CarEntry.get() volume_start = int(VolumeSEntry.get()) price_start = int(PriceSEntry.get()) volume_finish = int(VolumeFEntry.get()) price_finish = int(PriceFEntry.get()) expenses = int(ExpensesEntry.get()) profit = volume_finish * price_finish - volume_start * price_start - expenses print('Ок') os.system('CLS') print("Формируется словарь. ", end="") data_driver = < 'name':name_driver, 'numbers':number_driver, 'car':car_driver, 'Vs':volume_start, 'Ps':price_start, 'Vf':volume_finish, 'Pf':price_finish, 'Ex':expenses, 'Prof':profit, >print("Ок") print("Собираем фрейм. ", end="") columns = ['ФИО', 'Телефон', 'Машина', 'Объем на старте', 'Цена покупки', 'Объем на выходе', 'Цена продажи', 'Затраты', 'Профит',] data = [[data_driver['name'], data_driver['numbers'], data_driver['car'], data_driver['Vs'], data_driver['Ps'], data_driver['Vf'], data_driver['Pf'], data_driver['Ex'], data_driver['Prof'] ]] df = pd.DataFrame(data, columns=columns) print('Ок') print('Делаем запись. ', end='') df.to_csv(r'data.csv', mode='a', sep='/', header=False, index=False, encoding='utf-8') print('Ок') positive = 'Запись успешно добалена!' messagebox.showinfo('Уведомление', positive) def read_data(): df =pd.read_csv(r'data.csv', sep='/', names = ['ФИО', 'Телефон', 'Машина', 'Объем на старте', 'Цена покупки', 'Объем на выходе', 'Цена продажи', 'Затраты', 'Профит']) print(df) root = Tk() root.title('F1') root.geometry('500x600') button_padding = header_padding = #ФИО водителя NameUserLabel = Label(root, text='ФИО водителя: ', **header_padding) NameUserLabel.grid(row = 1, rowspan=1, column=1, sticky='w') NameUserEntry = Entry(root, bg='#fff', fg='#444') NameUserEntry.grid(row = 2, rowspan=1, column=1,sticky='w') #Номер телефона NumbersLabel = Label(root, text='Номер телефона: ') NumbersLabel.grid(row = 1, rowspan=1, column=3, sticky='w') NumbersEntry = Entry(root, bg='#fff', fg='#444') NumbersEntry.grid(row = 2, rowspan=1, column=3,sticky='w') #марка машины, номер CarLabel = Label(root, text='Машина(марка,г.с.з.: ', **header_padding) CarLabel.grid(row = 3, rowspan=1, column=1, sticky='w') CarEntry = Entry(root, bg='#fff', fg='#444') CarEntry.grid(row = 4, rowspan=1, column=1,sticky='w') #объем при покупке VolumeSLabel = Label(root, text='Объем (покупка): ', **header_padding) VolumeSLabel.grid(row = 6, rowspan=1, column=1, sticky='w') VolumeSEntry = Entry(root, bg='#fff', fg='#444') VolumeSEntry.grid(row = 7, rowspan=1, column=1,sticky='w') #цена покупки PriceSLabel = Label(root, text='Цена (покупка): ') PriceSLabel.grid(row = 6, rowspan=1, column=3, sticky='w') PriceSEntry = Entry(root, bg='#fff', fg='#444') PriceSEntry.grid(row = 7, rowspan=1, column=3,sticky='w') #объем при продаже VolumeFLabel = Label(root, text='Объем (продажа): ', **header_padding) VolumeFLabel.grid(row = 9, rowspan=1, column=1, sticky='w') VolumeFEntry = Entry(root, bg='#fff', fg='#444') VolumeFEntry.grid(row = 10, rowspan=1, column=1,sticky='w') #цена при продаже PriceFLabel = Label(root, text='Цена (продажа): ') PriceFLabel.grid(row = 9, rowspan=1, column=3, sticky='w',) PriceFEntry = Entry(root, bg='#fff', fg='#444') PriceFEntry.grid(row = 10, rowspan=1, column=3,sticky='w') #прочие затраты ExpensesLabel = Label(root, text='Прочие затраты: ', **header_padding) ExpensesLabel.grid(row = 12, rowspan=1, column=1, sticky='w') ExpensesEntry = Entry(root, bg='#fff', fg='#444', ) ExpensesEntry.grid(row = 13, rowspan=1, column=1,sticky='w') #профит, высчитывается и вносится в таблицу # кнопка сделать запись ButtonWrite = Button(root, text='Сделать запись', bg='#fff', fg='#444') ButtonWrite.grid(row = 15, rowspan=1, column=1, sticky='ws') ButtonWrite.config(command=data_user) # кнопка очистки данных ButtonDelete = Button(root, text='очистить данные', bg='#fff', fg='#444') ButtonDelete.grid(row = 15, rowspan=1, column=3, sticky='w') ButtonDelete.config(command=clear) root.mainloop()
  • Вопрос задан более двух лет назад
  • 5909 просмотров

7. Tkinter. Текстовое поле¶

Элемент Entry представляет поле для ввода текста. Конструктор Entry принимает следующие параметры:

Entry(master, options) 

где master - ссылка на родительское окно, а options - набор следующих параметров:

  • bg: фоновый цвет
  • bd: толщина границы
  • cursor: курсор указателя мыши при наведении на текстовое поле
  • fg: цвет текста
  • font: шрифт текста
  • justify: устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю
  • relief: определяет тип границы, по умолчанию значение FLAT
  • selectbackground: фоновый цвет выделенного куска текста
  • selectforeground: цвет выделенного текста
  • show: задает маску для вводимых символов
  • state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
  • textvariable: устанавливает привязку к элементу StringVar
  • width: ширина элемента
from tkinter import * window = Tk() window.title("Welcome to entry app") txt = Entry(window, width=10) txt.pack() window.mainloop() 

скриншот

from tkinter import * window = Tk() window.title("Welcome to the second entry app") txt1 = Entry(window, width=10) txt2 = Entry(window, width=10) txt1.pack() txt2.pack() window.mainloop() 

скриншот

from tkinter import * root = Tk() root.title("Welcome to the second entry app") lbl_login = Label(root, text="Login") lbl_pass = Label(root, text="Password") txt1 = Entry(root, width=10) txt2 = Entry(root, width=10) btn = Button(root, text="Enter") lbl_login.pack() txt1.pack() lbl_pass.pack() txt2.pack() btn.pack() root.mainloop() 

скриншот

from tkinter import * def clicked(): lbl_welcome.configure(text="Welcome. ") root = Tk() root.title("Welcome to the second entry app") lbl_login = Label(root, text="Login") lbl_pass = Label(root, text="Password") lbl_welcome = Label(root) txt1 = Entry(root, width=10) txt2 = Entry(root, width=10) btn = Button(root, text="Enter", command=clicked) lbl_login.pack() txt1.pack() lbl_pass.pack() txt2.pack() btn.pack() lbl_welcome.pack() root.mainloop() 

скриншот

Определим элемент Entry и по нажатию на кнопку выведем его текст в отдельное окно с сообщением:

from tkinter import * from tkinter import messagebox def show_message(): messagebox.showinfo("GUI Python", message.get()) root = Tk() root.title("GUI на Python") root.geometry("300x250") message = StringVar() message_entry = Entry(textvariable=message) message_entry.place(relx=.5, rely=.1, anchor="c") message_button = Button(text="Click Me", command=show_message) message_button.place(relx=.5, rely=.5, anchor="c") root.mainloop() 

скриншот

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

Теперь создадим более сложный пример с формой ввода:

from tkinter import * from tkinter import messagebox def display_full_name(): messagebox.showinfo("GUI Python", name.get() + " " + surname.get()) root = Tk() root.title("GUI на Python") name = StringVar() surname = StringVar() name_label = Label(text="Введите имя:") surname_label = Label(text="Введите фамилию:") name_label.grid(row=0, column=0, sticky="w") surname_label.grid(row=1, column=0, sticky="w") name_entry = Entry(textvariable=name) surname_entry = Entry(textvariable=surname) name_entry.grid(row=0,column=1, padx=5, pady=5) surname_entry.grid(row=1,column=1, padx=5, pady=5) message_button = Button(text="Click Me", command=display_full_name) message_button.grid(row=2,column=1, padx=5, pady=5, sticky="e") root.mainloop() 

скриншот

7.1.1. Методы Entry¶

Элемент Entry имеет ряд методов. Основные из них:

  • insert(index, str): вставляет в текстовое поле строку по определенному индексу
  • get(): возвращает введенный в текстовое поле текст
  • delete(first, last=None): удаляет символ по индексу first. Если указан параметр last, то удаление производится до индекса last. Чтобы удалить до конца, в качестве второго параметра можно использовать значение END.

Используем методы в программе:

from tkinter import * from tkinter import messagebox def clear(): name_entry.delete(0, END) surname_entry.delete(0, END) def display(): messagebox.showinfo("GUI Python", name_entry.get() + " " + surname_entry.get()) root = Tk() root.title("GUI на Python") name_label = Label(text="Введите имя:") surname_label = Label(text="Введите фамилию:") name_label.grid(row=0, column=0, sticky="w") surname_label.grid(row=1, column=0, sticky="w") name_entry = Entry() surname_entry = Entry() name_entry.grid(row=0,column=1, padx=5, pady=5) surname_entry.grid(row=1,column=1, padx=5, pady=5) # вставка начальных данных name_entry.insert(0, "Tom") surname_entry.insert(0, "Soyer") display_button = Button(text="Display", command=display) clear_button = Button(text="Clear", command=clear) display_button.grid(row=2, column=0, padx=5, pady=5, sticky="e") clear_button.grid(row=2, column=1, padx=5, pady=5, sticky="e") root.mainloop() 

При запуске программы сразу же в оба текстовых поля добавляется текст по умолчанию:

name_entry.insert(0, "Tom") surname_entry.insert(0, "Soyer") 

Кнопка Clear очищает оба поля, вызывая метод delete:

def clear(): name_entry.delete(0, END) surname_entry.delete(0, END) 

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

def display(): messagebox.showinfo("GUI Python", name_entry.get() + " " + surname_entry.get()) 

Причем, как видно из примера, нам необязательно обращаться к тексту в Entry через переменные типа StringVar, мы можем это сделать напрямую через метод get.

7.2. Многострочное текстовое поле¶

Text() предназначен для предоставления пользователю возможности ввода не одной строки текста, а существенно больше:

tex = Text(root,width=40, font="Verdana 12", wrap=WORD) 

Последнее свойство (wrap) в зависимости от своего значения позволяет переносить текст, вводимый пользователем либо по символам, либо по словам, либо вообще не переносить, пока пользователь не нажмет Enter.

7.2.1. Упражнения¶

  1. Напишите программы, описанные в уроке.
  2. Создайте пример трёх программ с использованием многострочного текстового поля.

Tkinter/Entry

Entry - Виджет Tkinter который создаёт текстовое поле для ввода текста.

Параметры [ ]

  • show: задает маску для вводимых символов
  • state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
  • textvariable: устанавливает привязку к элементу StringVar

Методы [ ]

.get() [ ]

Можно получить данные из текстового поля. Пример:

from tkinter import * window = Tk() window.geometry('400x400') def data(): text = entry.get() label['text'] = text label = Label(font = 'Ariel 30') button = Button(text = 'Преобразовать', command = data) entry = Entry() entry.pack() button.pack() label.pack() window.mainloop() 

.insert() [ ]

from tkinter import * window = Tk() window.geometry('400x400') add = lambda: entry.insert(1, 'Сделано Python вики!') button = Button(text = 'Базовый текст', command = add) entry = Entry() entry.pack() button.pack() label.pack() window.mainloop() 

.delete() [ ]

from tkinter import * window = Tk() window.geometry('400x400') clear = lambda: entry.delete(0, END) # До каких символов будет удалятся button = Button(text = 'Очистить', command = clear) entry = Entry() entry.pack() button.pack() window.mainloop() 

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA, если не указано иное.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *