2013-02-12 9 views
44

Python 2.7.3のテキストボックスからTkinter入力を取得する方法は?Tkinter Text Boxウィジェットからの入力を取得するには?

EDIT

私は同じ問題で他の人を助けるためにこの質問をした - は何のコード例がない理由であること。この問題は数時間私を悩ませていました。私はこの質問を使って他人を教えました。 を実際の質問と同じように評価しないでください。答えは重要なことです。

答えて

59

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

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

最初の部分、"1.0"は、入力ライン一つの文字ゼロ(:非常に最初の文字IE)から読まれるべきであることを意味します。 ENDは、インポートされた定数で、文字列"end"に設定されています。 END部分は、テキストボックスの最後に達するまで読むことを意味します。これに関する唯一の問題は、実際に入力に改行を追加することです。そこで、修正するためにENDend-1c(ありがとうBryan Oakley)に変更する必要があります。-1cは1文字を削除し、-2cは2文字を削除するなどとなります。私が使用し、完全な学生のレベルのプログラムは下のようであるのpython 3のテキストボックスからの入力のTkinter取得するには

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

' "エンド1cと"'や 'END + "1C"'、それ以外の場合は、テキストウィジェットが常に追加する余分な改行を取得します。 –

+0

@Bryan Oakleyありがとう、 '-1c/1c'は「改行を削除するのですか?また、テキストウィジェット/ Tkinter以外の領域でも使用できますか? – xxmbabanexx

+0

[NMTechリファレンス](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html)の[テキストウィジェット]→[テキストウィジェットインデックス](http:// infohost .nmt.edu/tcc/help/pubs/tkinter/web/text-index.html) –

4

:ここ

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

は私の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() 

これで、テキストウィジェットで「blah blah」と入力してボタンを押したときに、入力したものが印刷されました。だから私はそれが変数にテキストウィジェットからのユーザー入力を格納するための答えだと思います。一つは、単に文字のstartend位置として1〜2引数、text_widget_object.get(start, end=None)を受け付けるTextために定義されたget方法を使用することができTextウィジェットの文字列を得るために

0

。唯一startが渡され、endが渡されていない、それはstartに位置のみ単一の文字を返す場合endが同様に渡さであれば、それは文字列として位置startendの間のすべての文字を返します。

の変数とその下にあるTkの特別な文字列もあります。そのうちの1つは、Textウィジェットの最後の文字の可変位置を表す"end"またはです。たとえば、最後の改行文字が不要な場合は、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() 
あなたが何をすべき
関連する問題