# Entry — Однострочное текстовое поле
Элемент Entry представляет поле для ввода текста. Конструктор Entry принимает следующие параметры:
где 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 * root = Tk() root.title("Welcome to entry app") text = Entry(root, width=50) text.pack() root.mainloop()
from tkinter import * root = Tk() root.title("Welcome to the second entry app") text1 = Entry(root, width=20) text1.pack() text2 = Entry(root, width=50) text2.pack() root.mainloop()
from tkinter import * root = Tk() root.title("Welcome to the second entry app") label_login = Label(root, text="Login") label_login.pack() text1 = Entry(root, width=50) text1.pack() label_pass = Label(root, text="Password") label_pass.pack() text2 = Entry(root, width=50) text2.pack() button = Button(root, text="Enter") button.pack() root.mainloop()
from tkinter import * def check_pass(): if entry_login.get() and entry_pass.get(): label_welcome.configure(text="Welcome. ") else: label_welcome.configure(text="Please enter the login\nand the password.") root = Tk() root.title("Welcome to the second entry app") label_login = Label(root, text="Login") label_login.pack() entry_login = Entry(root, width=10) entry_login.pack() label_pass = Label(root, text="Password") label_pass.pack() entry_pass = Entry(root, width=10, show='%') entry_pass.pack() button = Button(root, text="Enter", command=check_pass) button.pack() label_welcome = Label(root) label_welcome.pack() root.mainloop()
Для работы с текстом, находящимся в текстовом поле, необходимо создать переменную в которой будут храниться значения, которые будут выводиться или считываться в текстовом поле. Общий вид программы зададим следующий:
from tkinter import * root = Tk() root.title("Welcome to entry app") message = StringVar() message.set("Any") text = Entry(root, width=10, textvariable=message) text.pack() root.mainloop()
Здесь команда message.set(«Any») — устанавливает значение переменной равное строке «Any». И параметру textvariable присваивается значение переменной message.
Исследуйте переменную message добавив недостающий следующий код:
message = StringVar() print(message) print(type(message)) message.set("Any") print(message) print(message.get())
Подумайте над последовательностью и работой команд message.set() и message.get() . Что происходит при выполнении каждой из команд?
Определим элемент 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.pack() message_button = Button(text="Click Me", command=show_message) message_button.pack() 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_label = Label(text="Введите имя:") name_label.grid(row=0, column=0, sticky="w") name = StringVar() name_entry = Entry(textvariable=name) name_entry.grid(row=0, column=1) surname_label = Label(text="Введите фамилию:") surname_label.grid(row=1, column=0, sticky="w") surname = StringVar() surname_entry = Entry(textvariable=surname) surname_entry.grid(row=1, column=1) message_button = Button(text="Click Me", command=display_full_name) message_button.grid(row=2, column=1) root.mainloop()
# Методы 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="Введите имя:") name_label.grid(row=0, column=0, sticky="w") name_entry = Entry() name_entry.grid(row=0,column=1) name_entry.insert(0, "Tom") surname_label = Label(text="Введите фамилию:") surname_label.grid(row=1, column=0, sticky="w") surname_entry = Entry() surname_entry.grid(row=1, column=1) surname_entry.insert(0, "Soyer") display_button = Button(text="Display", command=display) display_button.grid(row=2, column=0) clear_button = Button(text="Clear", command=clear) clear_button.grid(row=2, column=1) 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() .
# Упражнения
- Создайте окно с текстовым полем Entry , и задайте значение текстового поля: «Текстовое поле вводит и выводит текст только одной строкой», используя метод .insert() .
- Используя переменную StringVar() . Создайте окно с текстовым полем и двумя кнопками:
- кнопкой «Paste», при нажатии на которую, в текстовом поле выводится текст: «The button clicked!».
- кнопкой «Clear», при нажатии на которую, текст в текстовом поле стирается.
- кнопкой «Paste», при нажатии на которую, в текстовом поле выводится текст: «The button clicked!».
- кнопкой «Clear», при нажатии на которую, текст в текстовом поле стирается.
The first line The second line
- при нажатии на вторую кнопку, должны выводиться значения первого и второго полей в консоль с пояснениями в виде:
"Значение первого поля: " "Значение второго поля: "
Как очистить поле ввода в Tkinter?
Здравствуйте, нужна помощь. Изучаю Python и решил написать небольшую программу, чтобы немного разобраться во всем.
- Получать данные от пользователя и вносить их в файл.
- При запросе пользователя прочитать файл и вывести данные в табличном виде.
- Удалить ненужные данные (ошибка или потеря актуальности).
Изначально попробовал написать чисто консольный скрипт, теперь хочу добавить немного «красивостей». Использую для этого 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()