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

Как получить значение из entry tkinter

  • автор:

Как получить значение Entry в tkinter?

Я пытаюсь использовать виджет Entry Tkinter. Я не могу заставить его сделать что-то очень простое: вернуть введенное значение. Есть ли у кого-то идеи, почему такой простой скрипт ничего не вернет? Я пробовал множество комбинаций и смотрел на различные идеи.

Этот скрипт работает, но не печатает запись:

from Tkinter import * root = Tk() E1 = Entry(root) E1.pack() entry = E1.get() root.mainloop() print "Entered text:", entry 

Кажется, это так просто.

Редактировать

В случае, если кто-то еще сталкивается с этой проблемой и не понимает, вот что в итоге сработало для меня. Я добавил кнопку в окно записи. Команда кнопки закрывает окно и выполняет функцию get():

from Tkinter import * def close_window(): global entry entry = E.get() root.destroy() root = Tk() E = tk.Entry(root) E.pack(anchor = CENTER) B = Button(root, text = "OK", command = close_window) B.pack(anchor = S) root.mainloop() 

И это возвращает нужное значение.

Поделиться Источник 26 февраля 2016 в 22:22

2 ответа

Ваша первая проблема заключается в том, что вызов get в entry = E1.get() происходит еще до запуска вашей программы, поэтому явно entry будет указывать на пустую строку.

Ваша конечная вторая проблема заключается в том, что текст будет печататься только после завершения основного цикла, т.е. вы закроете приложение tkinter.

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

import Tkinter as tk def on_change(e): print e.widget.get() root = tk.Tk() e = tk.Entry(root) e.pack() # Calling on_change when you press the return key e.bind("", on_change) root.mainloop() 

Поделиться 26 февраля 2016 в 22:51

from tkinter import * import tkinter as tk root =tk.Tk() mystring =tk.StringVar(root) def getvalue(): print(mystring.get()) e1 = Entry(root,textvariable = mystring,width=100,fg="blue",bd=3,selectbackground='violet').pack() button1 = tk.Button(root, text='Submit', fg='White', bg= 'dark green',height = 1, width = 10,command=getvalue).pack() root.mainloop() 

Как получить int значения с виджета Entry?

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

2 проблема:

bt1.bind('', generate_set("A")) bt2.bind('', generate_set("B")) bt3.bind('', generate_set("C")) 

в таких строках функция сразу вызывается, а в метод bind передается результат ее выполнения. Чтобы функция не выполнялась сразу, можно обернуть ее в лямбду:

bt1.bind('', lambda event: generate_set("A")) 

Параметр event в данном случае нужен из-за того, что в обработчик события всегда передается параметр с описанием события.

3 скорее совет, а не проблема:

К кнопкам лучше привязываться через параметр command , а не через события. При привязке к событию клика мышью кнопка может вести себя не совсем нормально — «залипать» при клике, например. Также, при привязке через command аргумент event не передается.

С учетом вышесказанного:

from tkinter import * import random root = Tk() root.geometry("500x500") main_menu = Menu() a = set() b = set() с = set() #Functions def generate_set(elem): if elem == "A": value1 = Entry1.get() a = set(random.randint(-10,10) for i in range(int(value1))) print(a) # выводим на консоль, чтобы видно было, что что-то происходит elif elem == "B": value2 = Entry2.get() b = set(random.randint(-10,10) for i in range(int(value2))) print(b) elif elem == "C": value3 = Entry3.get() c = set(random.randint(-10,10) for i in range(int(value3))) print(c) ############################ root.config(menu = main_menu) e1 = Label(text = "Бурбело Сергій Сергійович ІВ-91 Номер у списку 04") e1.pack() lab1 =Label(text = "Введіть кількість елементів:").place(x = 8 , y = 200) Entry1 = Entry(root, width = 25) Entry1.place(x = 10, y = 220) bt1 = Button(text = "Згенерувати множину А ", command=lambda: generate_set("A")) bt1.pack(side = LEFT, padx = 10) lab2 =Label(text = "Введіть кількість елементів:").place(x = 330 , y = 200) Entry2 = Entry(root,width = 25) Entry2.place(x = 330, y = 220) bt2 = Button(text ="Згенерувати множину B ", command=lambda: generate_set("B")) bt2.pack(side = RIGHT, padx = 25) lab3 =Label(text = "Введіть кількість елементів:").place(x = 170 , y = 280) Entry3 = Entry(root, width = 25) Entry3.place(x = 170, y = 300) bt3 = Button(text = "Згенерувати множину C ", command=lambda: generate_set("C")) bt3.place(x = 170, y = 320) root.mainloop() 

[Tkinter] Как получить значение переменной из entry?

Author24 — интернет-сервис помощи студентам

Как в Tkinter задавать координаты для класса Entry?
Доброго времени суток. Не смог решить проблему, как вставить в нужное место поле для текстового.

Как сделать кнопку суммирования значений двух Entry в Tkinter?
Привет, не могу решить задачу по GUI, Python. Не могли бы вы мне подсказать, как вывести функцию.

Не могу получить значение из Entry
При выводе принта, не выводит значение. import tkinter as tk from functools import partial.

Entry Tkinter
Привет всем, задача стоит в том чтоб посчитать определенный интеграл на Tkinter’e.Пользователь.

135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 400

Лучший ответ

Сообщение было отмечено Aydar1313 как решение

Решение

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

tkinter entry
Доброго времени суток Вот есть такое окно from tkinter import * def win(): root = Tk() .

Tkinter и Entry
Доброго времени суток! Для вуза надо написать лабораторную работу.Все довольно.

Tkinter. Валидация Entry
Всем доброго времени суток! Подскажите, пожалуйста, как я могу валидировать вводимое в Entry.

Функция entry tkinter
Не могу понять как реализовать ввод радиуса Код выводит график кардиоиды при нажатии кнопки Draw .

Проблема с Tkinter: entry.get() не работает
Я понимаю, что дело в том, что entry находится в другом классе, но не могу понять как сделать так.

Или воспользуйтесь поиском по форуму:

Как получить значение из 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

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

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