如何从Python 2.7.3中的文本框获取Tkinter输入?
修改
我问这个问题是为了帮助其他人解决同样的问题 - 是没有示例代码的原因。这个问题困扰了我好几个小时,我用这个问题教别人。 请不要将它评价为真正的问题 - 答案是重要的。
答案 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
已通过,它返回位置end
和start
之间的所有字符作为字符串。
还有一些特殊字符串,它们是底层Tk的变量。其中一个是end
或"end"
,它代表tk.END
小部件中最后一个字符的变量位置。例如,如果您不想要最后一个换行符,则返回窗口小部件中的所有文本,Text
或text_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
函数,get
和text
小部件都具有此功能。
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