Перейти к содержимому

Как получить значение из 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 получить значение из entry для построения графика

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

maxi994
Новичок

Пользователь
Авг 28, 2020 1 0 1

Не могу построить график после ввода. в чеем проблема?

from tkinter import *
from docxtpl import DocxTemplate
import numpy as np
from scipy.interpolate import BSpline, UnivariateSpline, Akima1DInterpolator, PchipInterpolator
import matplotlib.pyplot as plt

root = Tk()
root.geometry("1080x600")

u0 = StringVar()
u1 = StringVar()
u2 = StringVar()
u3 = StringVar()
u4 = StringVar()
u5 = StringVar()
u6 = StringVar()
u7 = StringVar()
u8 = StringVar()

# Creating a Label Widget
myLabel1 = Label(root, borderwidth=1, text="Hello World!").grid(row=0, column=0)
e_entry = Entry(root, relief=RAISED, borderwidth=1, textvariable = e).grid(row=0, column=3)
x_data0 = Label(root, borderwidth=1, text="I, А").grid(row=2, column=0)
y_data0 = Label(root, borderwidth=1, text="U, В").grid(row=3, column=0)

i0 = Label(root, borderwidth=1, text="0").grid(row=2, column=1)
i1 = Label(root, borderwidth=1, text="0.005").grid(row=2, column=2)
i2 = Label(root, borderwidth=1, text="0.01").grid(row=2, column=3)
i3 = Label(root, borderwidth=1, text="0.1").grid(row=2, column=4)
i4 = Label(root, borderwidth=1, text="0.2").grid(row=2, column=5)
i5 = Label(root, borderwidth=1, text="0.3").grid(row=2, column=6)
i6 = Label(root, borderwidth=1, text="0.5").grid(row=2, column=7)
i7 = Label(root, borderwidth=1, text="0.7").grid(row=2, column=8)
i8 = Label(root, borderwidth=1, text="1").grid(row=2, column=9)

e = Label(root, borderwidth=1, text="u0").grid(row=3, column=1)
u0_e = Entry(root, relief=RAISED, borderwidth=1, textvariable = u0)
u0_e.grid(row=3, column=2)

u1_e = Entry(root, relief=RAISED, borderwidth=1)
u1_e.grid(row=3, column=2)

u2_e = Entry(root, relief=RAISED, borderwidth=1)
u2_e.grid(row=3, column=3)

u3_e = Entry(root, relief=RAISED, borderwidth=1)
u3_e.grid(row=3, column=4)

u4_e = Entry(root, relief=RAISED, borderwidth=1,)
u4_e.grid(row=3, column=5)

u5_e = Entry(root, relief=RAISED, borderwidth=1)
u5_e.grid(row=3, column=6)

u6_e = Entry(root, relief=RAISED, borderwidth=1)
u6_e.grid(row=3, column=7)

u7_e = Entry(root, relief=RAISED, borderwidth=1)
u7_e.grid(row=3, column=8)

u8_e = Entry(root, relief=RAISED, borderwidth=1)
u8_e.grid(row=3, column=9)

def myClick ():
tpl = DocxTemplate ('template.docx')
context = 'e': e.get()
>
tpl.render(context)
tpl.add_picture('BAX.png')
tpl.save('dynamic_table.docx')

def myClick_1 ():
plt.show()

def multiply_by(value, by):
return value * by

def GetData(event):
u1_getfl = float(u1_e.get())
u2_getfl = float(u2_e.get())
u3_getfl = float(u3_e.get())
u4_getfl = float(u4_e.get())
u5_getfl = float(u5_e.get())
u6_getfl = float(u6_e.get())
u7_getfl = float(u7_e.get())
u8_getfl = float(u8_e.get())
print(float(u1_e.get()))

def plotXY(event):
GetData(event)
u1_getfl = float(u1_e.get())
u2_getfl = float(u2_e.get())
u3_getfl = float(u3_e.get())
u4_getfl = float(u4_e.get())
u5_getfl = float(u5_e.get())
u6_getfl = float(u6_e.get())
u7_getfl = float(u7_e.get())
u8_getfl = float(u8_e.get())

x_data = np.array([0, 0.005, 0.01, 0.1, 0.2, 0.3, 0.5, 0.7, 1])
y_d = (0, u1_getfl(), u3_getfl(), u3_getfl(), u4_getfl(), u5_getfl(), u6_getfl(), u7getfl(), u8_getfl())

x_data_smooth = np.linspace(min(x_data), max(x_data), 1000)
fig, ax = plt.subplots(1,1)

bi = PchipInterpolator(x_data, y_data)
y_data_smooth = bi(x_data_smooth)
ax.plot(x_data_smooth, y_data_smooth, 'b')

ax.plot(x_data_smooth, y_data_smooth)
ax.scatter(x_data, y_data)

plt.title('График намагничивания')
plt.ylabel('U, В')
plt.xlabel('I, мА')
plt.grid(True)
plt.savefig('BAX.png', bbox_inches = 'tight')
plt.show()

myButton_2 = Button(root, text="gcnhjvnm!")
myButton_2.grid(row=6, column=8)
myButton_2.bind("", plotXY)

myButton_1 = Button(root, text="Показать график!")
myButton_1.grid(row=0, column=8)
myButton_1.bind("", GetData)

Виджет Tkinter Entry в Python – как использовать

Виджет Tkinter Entryв Python используется для отображения однострочного текстового поля для введения пользовательских значений. Мы можем применять виджет Entry, чтобы принимать текстовые строки от пользователя. Он позволяет вводить только одну строку текста. Для нескольких строк текста мы должны использовать текстовый виджет.

Синтаксис для использования виджета Entry приведен ниже.

w = Entry(parent, options)

Список возможных вариантов приведен ниже.

Вариант Описание
1 bg Цвет фона виджета.
2 bd Ширина границы виджета в пикселях.
3 cursor Указатель мыши изменится на тип курсора, установленный на стрелку, точку и т. д.
4 exportselection Текст, написанный внутри поля ввода, по умолчанию автоматически копируется в буфер обмена. Мы можем установить для параметра exportselection значение 0, чтобы не копировать это.
5 fg Он представляет цвет текста.
6 font Представляет тип шрифта текста.
7 highlightbackground Представляет цвет, отображаемый в выделенной области обхода, когда виджет не имеет фокуса ввода.
8 highlightcolor Он представляет цвет, используемый для прямоугольника выделения обхода, который рисуется вокруг виджета, когда он имеет фокус ввода.
9 highlightthickness Представляет собой неотрицательное значение, указывающее ширину выделенного прямоугольника для рисования за пределами виджета, когда он имеет фокус ввода.
10 insertbackground Он представляет собой цвет, используемый в качестве фона в области, охватываемой курсором вставки. Этот цвет обычно имеет приоритет над обычным фоном виджета.
11 insertborderwidth Представляет собой неотрицательное значение, указывающее ширину трехмерной границы, обводимой вокруг курсора вставки. Значение может иметь любую форму, приемлемую для Tk_GetPixels.
12 insertofftime Он представляет собой неотрицательное целое число, указывающее количество миллисекунд, в течение которого курсор вставки должен оставаться выключенным в каждом цикле мигания. Если этот параметр равен нулю, то курсор не мигает: он постоянно включен.
13 insertontime Задает неотрицательное целое число, указывающее количество миллисекунд, в течение которого курсор вставки должен оставаться включенным в каждом цикле мигания.
14 insertwidth Он представляет собой значение, указывающее общую ширину курсора вставки. Значение может иметь любую форму, приемлемую для Tk_GetPixels.
15 justify Он определяет, как организован текст, если текст состоит из нескольких строк.
16 relief Определяет тип границы. Его значение по умолчанию – FLAT.
17 selectbackground Цвет фона выделенного текста.
18 selectborderwidth Ширина границы, отображаемой вокруг выбранной задачи.
19 selectforeground Цвет шрифта выбранной задачи.
20 show Он используется для отображения текста ввода какого-либо другого типа вместо строки. Например, пароль вводится с использованием звездочек(*).
21 textvariable Он установлен на экземпляр StringVar для извлечения текста из записи.
22 width Ширина отображаемого текста или изображения.
23 xscrollcommand Виджет ввода можно связать с горизонтальной полосой прокрутки, если мы хотим, чтобы пользователь вводил больше текста, чем фактическая ширина виджета.

Пример

# !/usr/bin/python3 from tkinter import * top = Tk() top.geometry("400x250") name = Label(top, text = "Name").place(x = 30,y = 50) email = Label(top, text = "Email").place(x = 30, y = 90) password = Label(top, text = "Password").place(x = 30, y = 130) sbmitbtn = Button(top, text = "Submit",activebackground = "pink", activeforeground = "blue").place(x = 30, y = 170) e1 = Entry(top).place(x = 80, y = 50) e2 = Entry(top).place(x = 80, y = 90) e3 = Entry(top).place(x = 95, y = 130) top.mainloop()

Запись Python Tkinter

Методы виджета

Python предоставляет различные методы для настройки данных, записываемых внутри виджета. Виджет Entry предоставляет следующие методы.

Метод Описание
1 delete(first, last = none) Он используется для удаления указанных символов внутри виджета.
2 get() Он используется для записи текста внутри виджета.
3 index(index) Он используется для изменения положения курсора вставки. Мы можем указать индекс символа, перед которым будет помещен курсор.
4 index(индекс) Он используется для размещения курсора слева от символа, записанного по указанному индексу.
5 insert(index,s) Он используется для вставки указанной строки перед символом, помещенным в указанный индекс.
6 select_adjust(index) Включает выбор символа, присутствующего в указанном индексе.
7 select_clear() Очищает выбор, если какой-то выбор был сделан.
8 select_form(index) Он устанавливает позицию индекса привязки на символ, указанный индексом.
9 select_present() Возвращает истину, если выбран какой-либо текст в записи, в противном случае возвращает ложь.
10 select_range(start,end) Он выбирает символы, которые должны находиться в указанном диапазоне.
11 select_to(index) Он выбирает все символы от начала до указанного индекса.
12 xview(index) Используется для привязки виджета входа к горизонтальной полосе прокрутки.
13 xview_scroll(number,what) Он используется для горизонтальной прокрутки записи.

Пример: простой калькулятор

import tkinter as tk from functools import partial def call_result(label_result, n1, n2): num1 =(n1.get()) num2 =(n2.get()) result = int(num1)+int(num2) label_result.config(text="Result = %d" % result) return root = tk.Tk() root.geometry('400x200+100+200') root.title('Calculator') number1 = tk.StringVar() number2 = tk.StringVar() labelNum1 = tk.Label(root, text="A").grid(row=1, column=0) labelNum2 = tk.Label(root, text="B").grid(row=2, column=0) labelResult = tk.Label(root) labelResult.grid(row=7, column=2) entryNum1 = tk.Entry(root, textvariable=number1).grid(row=1, column=2) entryNum2 = tk.Entry(root, textvariable=number2).grid(row=2, column=2) call_result = partial(call_result, labelResult, number1, number2) buttonCal = tk.Button(root, text="Calculate", command=call_result).grid(row=3, column=0) root.mainloop()

Python-сообщество

[RSS Feed]

  • Начало
  • » GUI
  • » вернуть значение в переменную из entry (tkinter)

#1 Июнь 12, 2016 11:38:56

bad_playa Зарегистрирован: 2015-09-09 Сообщения: 7 Репутация: 0 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

подскажите как вернуть значение из поля entry в переменную, скажем глобальную
интересует как использовать precision за пределами метода getPrecision()

def getPrecision(): precision = float(entry.get()) entry = Entry(panelFrame, text = '') entry.grid() askPrecisionBtn = Button(panelFrame, text = 'Go', command = getPrecision()) askPrecisionBtn.grid() 

Отредактировано bad_playa (Июнь 12, 2016 11:39:44)

#2 Июнь 12, 2016 11:46:12

FishHook От: Зарегистрирован: 2011-01-08 Сообщения: 8312 Репутация: 568 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

Не надо никаких глобальных переменных.
ГУИ программы всеми разумными людьми пишутся на основе ООП. Освойте уже эту замечательную технологию и не будет таких удивительных вопросов.

#3 Июнь 12, 2016 11:53:03

bad_playa Зарегистрирован: 2015-09-09 Сообщения: 7 Репутация: 0 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

FishHook
Не надо никаких глобальных переменных.ГУИ программы всеми разумными людьми пишутся на основе ООП. Освойте уже эту замечательную технологию и не будет таких удивительных вопросов.

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

#4 Июнь 12, 2016 11:59:47

FishHook От: Зарегистрирован: 2011-01-08 Сообщения: 8312 Репутация: 568 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

bad_playa
А что конкретно у вас не получается нагуглить: глобальные переменные в питоне или ООП в питоне?
Я нагуглю за вас, не вопрос, вы только конкретизируйте, какую конкретно информацию вы не нашли в интернете.

#5 Июнь 12, 2016 12:08:06

bad_playa Зарегистрирован: 2015-09-09 Сообщения: 7 Репутация: 0 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

я не могу найти информацию, как вернуть precision из метода, который вызывается по нажатию кнопки.
все что мне нужно нажать на кнопку, и сохранить в переменную, которую я могу использовать дальше.
как мне это сделать, где почитать?

#6 Июнь 12, 2016 12:13:33

FishHook От: Зарегистрирован: 2011-01-08 Сообщения: 8312 Репутация: 568 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

ладно, пусть будет так

precision = None def getPrecision(): global precision precision = float(entry.get()) 

#7 Июнь 12, 2016 16:28:24

4kpt_IV Зарегистрирован: 2016-01-08 Сообщения: 999 Репутация: 49 Профиль Отправить e-mail

вернуть значение в переменную из entry (tkinter)

Пробросьте через lambda нужную переменную.
FishHook все правильно говорит. Глобальные переменные зло.

def getPrecision(my_data): my_data[0] = float(entry.get()) my_data = [] entry = Entry(panelFrame, text = '') entry.grid() askPrecisionBtn = Button(panelFrame, text = 'Go', command = lambda: getPrecision(my_data)) askPrecisionBtn.grid() 

Но это хоть и по-питонячьи, но все же не по tkinter
В tkinter есть специальные Var переменные, для такой работы.

В этом случае код будет выглядеть так:

def getPrecision(): print(my_data.get()) my_data = StringVar() entry = Entry(panelFrame, text = '', textvariable=my_data) entry.grid() askPrecisionBtn = Button(panelFrame, text='Go', command=getPrecision) askPrecisionBtn.grid() 

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

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