如何从Tkinter文本框小工具获取输入?

时间:2013-02-12 01:45:45

标签: python tkinter

如何从Python 2.7.3中的文本框获取Tkinter输入?

修改

我问这个问题是为了帮助其他人解决同样的问题 - 是没有示例代码的原因。这个问题困扰了我好几个小时,我用这个问题教别人。 不要将它评价为真正的问题 - 答案是重要的。

9 个答案:

答案 0 :(得分:97)

要从文本框中获取Tkinter输入,您必须向普通.get()函数添加更多属性。如果我们有一个文本框myText_Box,那么这就是检索其输入的方法。

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

第一部分"1.0"表示输入应该从第一行读取,字符为零(即:第一个字符)。 END是导入的常量,设置为字符串"end"END部分表示读取,直到到达文本框的末尾。唯一的问题是它实际上为我们的输入添加了换行符。因此,为了解决这个问题,我们应该将END更改为end-1c(感谢Bryan Oakley-1c删除1个字符,而-2c则意味着删除2个字符等等。

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

答案 1 :(得分:14)

以下是我使用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”并按下按钮时,无论打字输出的是什么。所以我认为这是将用户输入从Text小部件存储到变量的答案。

答案 2 :(得分:8)

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

答案 3 :(得分:4)

为了获取Text小部件中的字符串,可以简单地使用为Text定义的get方法,该方法接受1到2个参数start和{{1字符的位置,end。如果仅传递text_widget_object.get(start, end=None)且未传递start,则仅返回位于end的单个字符,如果start 已通过,它返回位置endstart之间的所有字符作为字符串。

还有一些特殊字符串,它们是底层Tk的变量。其中一个是end"end",它代表tk.END小部件中最后一个字符的变量位置。例如,如果您不想要最后一个换行符,则返回窗口小部件中的所有文本,Texttext_widget_object.get('1.0', 'end')

演示

请参阅下面的演示,使用滑块选择给定位置之间的字符:

text_widget_object.get('1.0', 'end-1c')

答案 4 :(得分: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()

答案 5 :(得分:1)

假设您有一个名为Text的{​​{1}}小部件。

要从my_text_widget中获得输入,您可以使用my_text_widget功能。

让我们假设您已导入get。 首先定义tkinter,让它成为一个简单的文本小部件。

my_text_widget

要从my_text_widget = Text(self) 小部件中获取输入,您需要使用text函数,gettext小部件都具有此功能。

entry

之所以将其保存到变量中,是为了在进一步的过程中使用它,例如,测试输入的内容。

答案 6 :(得分:0)

我也确实在搜索如何从“文本”小部件中获取输入数据。关于在字符串末尾使用新行的问题。您可以只使用.strip(),因为它是一个始终为字符串的Text小部件。

此外,我正在共享代码,您可以在其中看到如何创建多个Text窗口小部件并将其保存为字典中的表单数据,然后单击“提交”按钮获取该表单数据并对其进行任何处理。希望对别人有帮助。它应该可以在任何3.x python中运行,并且可能也可以在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()

答案 7 :(得分:0)

我认为创建一个简单的Text扩展并将text变成属性是最干净的方法。然后,您可以将该扩展名粘贴在始终导入的某个文件中,并使用它代替原始的Text小部件。这样,您不必记住,编写,重复等所有使您转身去做最简单的事情的箍,您就有了一个对接简单的界面,可以在任何项目中重复使用。您也可以为Entry执行此操作,但是语法略有不同。

import tkinter as tk

root = tk.Tk()    
    
class Text(tk.Text):
    @property
    def text(self) -> str:
        return self.get('1.0', 'end-1c')
        
    @text.setter
    def text(self, value) -> None:
        self.replace('1.0', 'end-1c', value)
        
    def __init__(self, master, **kwargs):
        tk.Text.__init__(self, master, **kwargs)

#Entry version of the same concept as above      
class Entry(tk.Entry):
    @property
    def text(self) -> str:
        return self.get()
        
    @text.setter
    def text(self, value) -> None:
        self.delete(0, 'end')
        self.insert(0, value)
        
    def __init__(self, master, **kwargs):
        tk.Entry.__init__(self, master, **kwargs)      
      
textbox = Text(root)
textbox.grid()

textbox.text = "this is text" #set
print(textbox.text)           #get  

entry = Entry(root)
entry.grid()

entry.text = 'this is text'   #set
print(entry.text)             #get

root.mainloop()

答案 8 :(得分:-1)

我遇到了从文本小部件获取整个文本的问题,以下解决方案对我有用:

txt.get(1.0,END)

其中1.0表示第一行,第零个字符(即在第一行之前!) 是开始位置,END是结束位置。

在此link

中,感谢Alan Gauld