LINUX.ORG.RU

Текстовое поле Tkinter

 


0

1

Недавно начал программировать на Python. Только что познакомился с конструкторами.

Очередная задача: создать текстовое поле Tkinter и вернуть введенную фразу.

Имеется скрипт, который это уже делает:

#!/usr/bin/python
#coding=UTF-8

from Tkinter import *

def callback():
	print text.get()

root = Tk()
text = Entry(root)
text.bind('<Return>', lambda e:callback())
text.pack()
# Перевести курсор в поле ввода
text.focus_set()
# Теперь кнопка поддерживает ЛКМ, пробел
b = Button(root, text="Ввести и выйти", width=10, command=callback())
# Теперь кнопка поддерживает Enter
b.bind('<Return>', lambda e:callback())
b.pack()
root.mainloop()

Хочу создать конструктор. Делаю:

#!/usr/bin/python
#coding=UTF-8

#from main import *
#command_title=command()

import Tkinter as tk

class App:
	def callback(self,mes):
		return mes
	def __init__(self,root):
		text_field=tk.Entry(root)
		text_field.bind('<Return>', lambda e:self.callback(mes))
		mes=text_field.get()
		text_field.pack()
		# Перевести курсор в поле ввода
		text_field.focus_set()
		# Теперь кнопка поддерживает ЛКМ, пробел
		#b = Button(root, text="Ввести и выйти", width=10, command=callback())
		# Теперь кнопка поддерживает Enter
		#b.bind('<Return>', lambda e:callback())
		#b.pack()
if __name__ == "__main__":
	root=tk.Tk()
	app=App(root)
	root.mainloop()
Callback должен вернуть значение текстового поля (так, чтобы я еще мог вне класса присвоить переменной этот результат) и разрушить окно. Как это сделать? Боюсь, что сильно напортачил, но пока не пойму, как исправить :(

Deleted

Все поля класса в методах класса адресуются через self., т.е. должно быть

self.text_field = ...

Значение текстового поля получается при вызове метода get:

    text = self.text_field.get()

Как callback будет разрушать окно, которое не принадлежит экземпляру класса, почему это каллбэк - этого я не вкурил.

AIv ★★★★★ ()
Ответ на: комментарий от AIv

Как callback будет разрушать окно, которое не принадлежит экземпляру класса, почему это каллбэк - этого я не вкурил.

То, что ввод закончен, программа должна понять по следующему:
1) Нажата клавиша Enter
2) Нажата кнопка
3) Кликнута кнопка

Все эти события должны вызывать следующее: уже введенный текст копируется в переменную, а окно Tkinter закрывается. Стало быть, это должна быть отдельная функция. Только как ее реализовать?

Deleted ()
Ответ на: комментарий от Deleted

Почитайте про модальные/не модальные диалоги что ли, Вы пытаетесь слепить судя по всему именно диалог.

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

!/usr/bin/python 
from Tkinter import *

def entry_text():
    root, res = Tk(), [None]
    def callback(): res[0] = entry.get(); root.destroy()
    entry = Entry(root); entry.pack(); entry.bind('<Return>', lambda e: callback())
    ok = Button(root, text='ok', command=callback); ok.pack()
    entry.focus_set(); root.mainloop()
    return res[0]

print entry_text()

Почитайте Марка Лутца.

AIv ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.