Tkinter Text Widgetから入力を取得する方法は?


98

TextウィジェットからTkinter入力を取得する方法は?

編集

私はこの質問をして、同じ問題を持つ他の人を助けるために尋ねました- それがサンプルコードがない理由です。この問題は何時間も悩まされてきました。私はこの質問を使って他の人に教えました。それが本当の質問であるかのように評価しないでください -答えは重要なことです。

回答:


132

テキストボックスからTkinter入力を取得するには、通常の.get()関数にさらにいくつかの属性を追加する必要があります。テキストボックスがある場合myText_Box、これはその入力を取得するためのメソッドです。

def retrieve_input():
    input = self.myText_Box.get("1.0",END)

最初の部分は"1.0"、入力が行1の文字ゼロ(つまり、最初の文字)から読み取られることを意味します。END文字列に設定されるインポートされた定数"end"です。ENDテキストボックスの最後に到達するまで、一部の手段は、読み取ります。これに関する唯一の問題は、実際に入力に改行が追加されることです。したがって、修正するには(Thanks Bryan Oakley)に変更ENDする必要があります。1文字が削除されますが、2文字が削除されます。end-1c-1c-2c

def retrieve_input():
    input = self.myText_Box.get("1.0",'end-1c')

20
"end-1c"またはを実行する必要がありEND+"1c"ます。そうしないと、テキストウィジェットが常に追加する追加の改行が表示されます。
Bryan Oakley

2
@xxmbabanexx:いいえ、「-1c」は「マイナス1文字」を意味します。
ブライアンオークリー

2
この何をしたいです:.get('1.0', 'end-1c')
正直阿部

1
ありがとう!好奇心から、もし私が書くend+1cとしたら、コードに新しい行を追加しますか?最後に、ブライアンとオネストエイブ、TkinterとPythonの簡単な質問で私を助けてくれてありがとう。あなたは私が言語をより深く理解するのを本当に助けてくれました、そして常に礼儀正しく、敏速で、そして何よりも最高の-知っている。あなたのアドバイスが私が高校やそれ以降に移動するときに私を助けると確信しています!
xxmbabanexx 2013

1
追加した例は機能しません。'end-1c'単一引用符で囲むには引用符が必要です。'end'最後の文字の後のインデックスのエイリアスです。その場合'end'だった'3.8'、その後'end-1c'になります'3.7'。もう一度確認することをお勧めします:テキストウィジェットのインデックス
Honest Abe

19

これが私が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()

これで、テキストウィジェットに「何とか」と入力してボタンを押すと、入力したものはすべて印刷されました。したがって、テキストウィジェットから変数へのユーザー入力を格納するための答えだと思います。


9

Python 3のテキストボックスからTkinter入力を取得するには、私が使用する完全な学生レベルプログラムは次のとおりです。

#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()

6

Textウィジェットで文字列を取得するために、1〜2個の引数と文字の位置を受け入れるgetforに対して定義されTextたメソッドを使用できます。場合にのみ渡され、それが位置のみ単一の文字を返し渡されない場合は、されにも渡され、それが位置の間のすべての文字を返しますし、文字列として。startendtext_widget_object.get(start, end=None)startendstartend startend

基になるTkの変数である特別な文字列もあります。それらの1つは、ウィジェットの最後の文字の変数位置を表す"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()

2

これはより良い方法だと思います

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は個別にインポートしてください。

完全なコードのための基本的なアプリケーションは-

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()

0

テキストウィジェットからテキスト全体を取得する問題に直面し、次の解決策が私のために機能しました:

txt.get(1.0,END)

1.0は最初の行を意味し、0番目の文字(つまり最初の文字の前!)が開始位置で、ENDが終了位置です。

このリンクの Alan Gauldに感謝


-3

というTextウィジェットがあるとしmy_text_widgetます。

から入力を取得my_text_widgetするには、get関数を使用できます。

インポートしたとしましょうtkintermy_text_widget最初に定義して、それを単なるテキストウィジェットにします。

my_text_widget = Text(self)

ウィジェットから入力を取得textするには、get関数を使用する必要がtextありentryます。両方にウィジェットがこれを持っています。

input = my_text_widget.get()

これを変数に保存する理由は、入力が何であるかをテストするなど、後続のプロセスで使用するためです。


1
この答えは間違っています。Textウィジェットのget方法は、少なくとも一つの引数を必要とします。
Bryan Oakley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.