Чтобы получить ввод Tkinter из текстового поля, вы должны добавить еще несколько атрибутов к обычной .get()
функции. Если у нас есть текстовое поле myText_Box
, то это метод получения его ввода.
def retrieve_input():
input = self.myText_Box.get("1.0",END)
Первая часть "1.0"
означает, что ввод следует читать из первой строки, нулевого символа (т.е. самого первого символа). END
- импортированная константа, присвоенная строке "end"
. В END
означает часть читать до конца текстового поля не будет достигнут. Единственная проблема заключается в том, что он фактически добавляет новую строку к нашему вводу. Итак, чтобы исправить это, мы должны изменить его END
на end-1c
(Спасибо, Брайан Окли ). -1c
Удаляет 1 символ, в то время как -2c
будет означать удаление двух символов и так далее.
def retrieve_input():
input = self.myText_Box.get("1.0",'end-1c')
"end-1c"
илиEND+"1c"
, иначе вы получите дополнительную строку новой строки, которую всегда добавляет текстовый виджет..get('1.0', 'end-1c')
end+1c
, добавило бы это новую строку в код? Наконец, Брайан и Честный Эйб, большое спасибо вам, ребята, за то, что помогли мне с моими простыми вопросами о Tkinter и Python. Вы действительно помогли мне получить более глубокое понимание языка и всегда были вежливы, быстры и, что самое главное, знающие. Я уверена, что ваш совет поможет мне при поступлении в школу и за ее пределами!'end-1c'
необходимы, чтобы это была одна строка.'end'
- это псевдоним индекса после последнего символа. Так что если бы'end'
было,'3.8'
то'end-1c'
было бы'3.7'
. Хочу еще раз рекомендовать обзор: Индексы текстовых виджетов .Вот как я это сделал с Python 3.5.2:
from tkinter import * root=Tk() def retrieve_input(): inputValue=textBox.get("1.0","end-1c") print(inputValue) textBox=Text(root, height=2, width=10) textBox.pack() buttonCommit=Button(root, height=1, width=10, text="Commit", command=lambda: retrieve_input()) #command=lambda: retrieve_input() >>> just means do this when i press the button buttonCommit.pack() mainloop()
при этом, когда я набирал «бла-бла» в текстовом виджете и нажимал кнопку, все, что я набирал, распечатывалось. Итак, я думаю, что это ответ на вопрос о сохранении пользовательского ввода из текстового виджета в переменную.
источник
Чтобы получить ввод Tkinter из текстового поля в Python 3, я использую полную программу уровня студента, как показано ниже:
#Imports all (*) classes, #atributes, and methods of tkinter into the #current workspace from tkinter import * #*********************************** #Creates an instance of the class tkinter.Tk. #This creates what is called the "root" window. By conventon, #the root window in Tkinter is usually called "root", #but you are free to call it by any other name. root = Tk() root.title('how to get text from textbox') #********************************** mystring = StringVar() ####define the function that the signup button will do def getvalue(): ## print(mystring.get()) #************************************* Label(root, text="Text to get").grid(row=0, sticky=W) #label Entry(root, textvariable = mystring).grid(row=0, column=1, sticky=E) #entry textbox WSignUp = Button(root, text="print text", command=getvalue).grid(row=3, column=0, sticky=W) #button ############################################ # executes the mainloop (that is, the event loop) method of the root # object. The mainloop method is what keeps the root window visible. # If you remove the line, the window created will disappear # immediately as the script stops running. This will happen so fast # that you will not even see the window appearing on your screen. # Keeping the mainloop running also lets you keep the # program running until you press the close buton root.mainloop()
источник
Для того , чтобы получить строку в
Text
виджете можно просто использоватьget
метод , описанный вText
который принимает от 1 до 2 аргументов какstart
иend
позицию символов,text_widget_object.get(start, end=None)
. Если толькоstart
передан иend
не передан, он возвращает только один символ, расположенный вstart
, еслиend
он также передан, он возвращает все символы между позициямиstart
и вend
виде строки.Также существуют специальные строки, которые являются переменными для базового Tk. Один из них будет
"end"
илиtk.END
который представляет переменную позицию самого последнего символа вText
виджете. Примером может быть возврат всего текста в виджете с последним символом новой строкиtext_widget_object.get('1.0', 'end')
илиtext_widget_object.get('1.0', 'end-1c')
если вы не хотите его.Демо
См. Ниже демонстрацию, которая выбирает символы между заданными позициями с помощью ползунков:
try: import tkinter as tk except: import Tkinter as tk class Demo(tk.LabelFrame): """ A LabeFrame that in order to demonstrate the string returned by the get method of Text widget, selects the characters in between the given arguments that are set with Scales. """ def __init__(self, master, *args, **kwargs): tk.LabelFrame.__init__(self, master, *args, **kwargs) self.start_arg = '' self.end_arg = None self.position_frames = dict() self._create_widgets() self._layout() self.update() def _create_widgets(self): self._is_two_args = tk.Checkbutton(self, text="Use 2 positional arguments...") self.position_frames['start'] = PositionFrame(self, text="start='{}.{}'.format(line, column)") self.position_frames['end'] = PositionFrame( self, text="end='{}.{}'.format(line, column)") self.text = TextWithStats(self, wrap='none') self._widget_configs() def _widget_configs(self): self.text.update_callback = self.update self._is_two_args.var = tk.BooleanVar(self, value=False) self._is_two_args.config(variable=self._is_two_args.var, onvalue=True, offvalue=False) self._is_two_args['command'] = self._is_two_args_handle for _key in self.position_frames: self.position_frames[_key].line.slider['command'] = self.update self.position_frames[_key].column.slider['command'] = self.update def _layout(self): self._is_two_args.grid(sticky='nsw', row=0, column=1) self.position_frames['start'].grid(sticky='nsew', row=1, column=0) #self.position_frames['end'].grid(sticky='nsew', row=1, column=1) self.text.grid(sticky='nsew', row=2, column=0, rowspan=2, columnspan=2) _grid_size = self.grid_size() for _col in range(_grid_size[0]): self.grid_columnconfigure(_col, weight=1) for _row in range(_grid_size[1] - 1): self.grid_rowconfigure(_row + 1, weight=1) def _is_two_args_handle(self): self.update_arguments() if self._is_two_args.var.get(): self.position_frames['end'].grid(sticky='nsew', row=1, column=1) else: self.position_frames['end'].grid_remove() def update(self, event=None): """ Updates slider limits, argument values, labels representing the get method call. """ self.update_sliders() self.update_arguments() def update_sliders(self): """ Updates slider limits based on what's written in the text and which line is selected. """ self._update_line_sliders() self._update_column_sliders() def _update_line_sliders(self): if self.text.lines_length: for _key in self.position_frames: self.position_frames[_key].line.slider['state'] = 'normal' self.position_frames[_key].line.slider['from_'] = 1 _no_of_lines = self.text.line_count self.position_frames[_key].line.slider['to'] = _no_of_lines else: for _key in self.position_frames: self.position_frames[_key].line.slider['state'] = 'disabled' def _update_column_sliders(self): if self.text.lines_length: for _key in self.position_frames: self.position_frames[_key].column.slider['state'] = 'normal' self.position_frames[_key].column.slider['from_'] = 0 _line_no = int(self.position_frames[_key].line.slider.get())-1 _max_line_len = self.text.lines_length[_line_no] self.position_frames[_key].column.slider['to'] = _max_line_len else: for _key in self.position_frames: self.position_frames[_key].column.slider['state'] = 'disabled' def update_arguments(self): """ Updates the values representing the arguments passed to the get method, based on whether or not the 2nd positional argument is active and the slider positions. """ _start_line_no = self.position_frames['start'].line.slider.get() _start_col_no = self.position_frames['start'].column.slider.get() self.start_arg = "{}.{}".format(_start_line_no, _start_col_no) if self._is_two_args.var.get(): _end_line_no = self.position_frames['end'].line.slider.get() _end_col_no = self.position_frames['end'].column.slider.get() self.end_arg = "{}.{}".format(_end_line_no, _end_col_no) else: self.end_arg = None self._update_method_labels() self._select() def _update_method_labels(self): if self.end_arg: for _key in self.position_frames: _string = "text.get('{}', '{}')".format( self.start_arg, self.end_arg) self.position_frames[_key].label['text'] = _string else: _string = "text.get('{}')".format(self.start_arg) self.position_frames['start'].label['text'] = _string def _select(self): self.text.focus_set() self.text.tag_remove('sel', '1.0', 'end') self.text.tag_add('sel', self.start_arg, self.end_arg) if self.end_arg: self.text.mark_set('insert', self.end_arg) else: self.text.mark_set('insert', self.start_arg) class TextWithStats(tk.Text): """ Text widget that stores stats of its content: self.line_count: the total number of lines self.lines_length: the total number of characters per line self.update_callback: can be set as the reference to the callback to be called with each update """ def __init__(self, master, update_callback=None, *args, **kwargs): tk.Text.__init__(self, master, *args, **kwargs) self._events = ('<KeyPress>', '<KeyRelease>', '<ButtonRelease-1>', '<ButtonRelease-2>', '<ButtonRelease-3>', '<Delete>', '<<Cut>>', '<<Paste>>', '<<Undo>>', '<<Redo>>') self.line_count = None self.lines_length = list() self.update_callback = update_callback self.update_stats() self.bind_events_on_widget_to_callback( self._events, self, self.update_stats) @staticmethod def bind_events_on_widget_to_callback(events, widget, callback): """ Bind events on widget to callback. """ for _event in events: widget.bind(_event, callback) def update_stats(self, event=None): """ Update self.line_count, self.lines_length stats and call self.update_callback. """ _string = self.get('1.0', 'end-1c') _string_lines = _string.splitlines() self.line_count = len(_string_lines) del self.lines_length[:] for _line in _string_lines: self.lines_length.append(len(_line)) if self.update_callback: self.update_callback() class PositionFrame(tk.LabelFrame): """ A LabelFrame that has two LabelFrames which has Scales. """ def __init__(self, master, *args, **kwargs): tk.LabelFrame.__init__(self, master, *args, **kwargs) self._create_widgets() self._layout() def _create_widgets(self): self.line = SliderFrame(self, orient='vertical', text="line=") self.column = SliderFrame(self, orient='horizontal', text="column=") self.label = tk.Label(self, text="Label") def _layout(self): self.line.grid(sticky='ns', row=0, column=0, rowspan=2) self.column.grid(sticky='ew', row=0, column=1, columnspan=2) self.label.grid(sticky='nsew', row=1, column=1) self.grid_rowconfigure(1, weight=1) self.grid_columnconfigure(1, weight=1) class SliderFrame(tk.LabelFrame): """ A LabelFrame that encapsulates a Scale. """ def __init__(self, master, orient, *args, **kwargs): tk.LabelFrame.__init__(self, master, *args, **kwargs) self.slider = tk.Scale(self, orient=orient) self.slider.pack(fill='both', expand=True) if __name__ == '__main__': root = tk.Tk() demo = Demo(root, text="text.get(start, end=None)") with open(__file__) as f: demo.text.insert('1.0', f.read()) demo.text.update_stats() demo.pack(fill='both', expand=True) root.mainloop()
источник
Я думаю, это лучший способ-
variable1=StringVar() # Value saved here def search(): print(variable1.get()) return '' ttk.Entry(mainframe, width=7, textvariable=variable1).grid(column=2, row=1) ttk.Label(mainframe, text="label").grid(column=1, row=1) ttk.Button(mainframe, text="Search", command=search).grid(column=2, row=13)
При нажатии кнопки значение в текстовом поле будет напечатано. Но убедитесь, что вы импортируете ttk отдельно.
Полный код для основного приложения IS -
from tkinter import * from tkinter import ttk root=Tk() mainframe = ttk.Frame(root, padding="10 10 12 12") mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(0, weight=1) variable1=StringVar() # Value saved here def search(): print(variable1.get()) return '' ttk.Entry(mainframe, width=7, textvariable=variable1).grid(column=2, row=1) ttk.Label(mainframe, text="label").grid(column=1, row=1) ttk.Button(mainframe, text="Search", command=search).grid(column=2, row=13) root.mainloop()
источник
Я столкнулся с проблемой получения всего текста из текстового виджета, и у меня сработало следующее решение:
txt.get(1.0,END)
Где 1.0 означает первую строку, нулевой символ (т.е. перед первым!) - это начальная позиция, а END - конечная позиция.
Спасибо Алану Голду за эту ссылку
источник
Я пришел также в поисках того, как получить входные данные из текстового виджета. По поводу проблемы с новой строкой в конце строки. Вы можете просто использовать .strip (), поскольку это текстовый виджет, который всегда является строкой.
Кроме того, я делюсь кодом, в котором вы можете увидеть, как можно создавать виджеты с множественным текстом и сохранять их в словаре как данные формы, а затем, нажав кнопку отправки, получить эти данные формы и делать с ними все, что вы хотите. Надеюсь, это поможет другим. Он должен работать с любым питоном 3.x и, вероятно, будет работать и с 2.7.
from tkinter import * from functools import partial class SimpleTkForm(object): def __init__(self): self.root = Tk() def myform(self): self.root.title('My form') frame = Frame(self.root, pady=10) form_data = dict() form_fields = ['username', 'password', 'server name', 'database name'] cnt = 0 for form_field in form_fields: Label(frame, text=form_field, anchor=NW).grid(row=cnt,column=1, pady=5, padx=(10, 1), sticky="W") textbox = Text(frame, height=1, width=15) form_data.update({form_field: textbox}) textbox.grid(row=cnt,column=2, pady=5, padx=(3,20)) cnt += 1 conn_test = partial(self.test_db_conn, form_data=form_data) Button(frame, text='Submit', width=15, command=conn_test).grid(row=cnt,column=2, pady=5, padx=(3,20)) frame.pack() self.root.mainloop() def test_db_conn(self, form_data): data = {k:v.get('1.0', END).strip() for k,v in form_data.items()} # validate data or do anything you want with it print(data) if __name__ == '__main__': api = SimpleTkForm() api.myform()
источник
Допустим, у вас есть
Text
виджет с именемmy_text_widget
.Чтобы получить входные данные от
my_text_widget
вы можете использоватьget
функцию.Предположим, вы импортировали
tkinter
. Давайтеmy_text_widget
сначала определимся , давайте сделаем это просто текстовым виджетом.Чтобы получить ввод от
text
виджета, вам нужно использовать этуget
функцию,text
и уentry
виджетов она есть.Причина, по которой мы сохраняем его в переменной, состоит в том, чтобы использовать его в дальнейшем процессе, например, для проверки того, что вводится.
источник
Text
виджетаget
требуется хотя бы один аргумент.