如何从Python中的多行Tkinter文本框中读取输入(逐行)?

时间:2013-07-19 13:04:48

标签: python tkinter

通过在Python中使用过程编程范例,我有一个编写的程序,它逐行读取文件的输入(比如File.txt)并打印出来。以下是示例:

脚本:

import fileinput
for line in fileinput.input(r'D:\File.txt'):
    line = line.replace(" ", "")
    line = line[0:-1]
    print(line)

结果:

注意:例如,如果“File.txt”包含2行,第一行为'line1',第二行为'line2',则输出为:

line1
line2

相同的结果我希望通过使用“Tkinter Multiline TextBox”而不是文件(在上面的示例File.txt中)通过面向对象的编程范例。

我有以下代码创建MultiLine Tkinter TextBox:

import tkinter as tki # Tkinter -> tkinter in Python3
class App(object):

    def __init__(self):
        self.root = tki.Tk()

    # create a Frame for the Text and Scrollbar
        txt_frm = tki.Frame(self.root, width=200, height=200)
        txt_frm.pack(fill="both", expand=True)

        # ensure a consistent GUI size
        txt_frm.grid_propagate(False)

        # implement stretchability
        txt_frm.grid_rowconfigure(0, weight=1)
        txt_frm.grid_columnconfigure(0, weight=1)

    # create a Text widget
        self.txt = tki.Text(txt_frm, borderwidth=3, relief="sunken")
        self.txt.config(font=("consolas", 12), undo=True, wrap='word')
        self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)

    # create a Scrollbar and associate it with txt
        scrollb = tki.Scrollbar(txt_frm, command=self.txt.yview)
        scrollb.grid(row=0, column=1, sticky='nsew')
        self.txt['yscrollcommand'] = scrollb.set

    def retrieve_input():
        input = self.txt.get("0.0",END)
        print(input)
app = App()
app.root.mainloop()
app.retrieve_input()

现在我的问题是,一旦我运行上面的代码,“Tkinter Multiline TextBox”即将到来,我在Tkinter TextBox中输入4行:

ABC
XYZ
PQR
QAZ

但是我没有得到精确的想法/实现,我如何逐个从Tkinter TextBox中读取这些行并将它们用于我的程序中的进一步处理。

我使用的Python版本是3.0.1。 请帮忙......

2 个答案:

答案 0 :(得分:2)

从文档中,get上的tkinter.text方法只返回字符串,包括新行\n。您无法将tkinter.text视为文件,但您可以使用其他方式。

  1. 全部阅读并将其拆分为一个列表。然后循环列表。

    def retrieve_input():
        text = self.txt.get('1.0', END).splitlines()
        for line in text:
            ...
    
  2. 使用io.StringIO模拟文件,但在这种情况下,它不会删除换行符。

    def retrieve_input():
        text = io.StringIO(self.txt.get('1.0', END))
        for line in text:
            line = line.rstrip()
            ...
    

答案 1 :(得分:2)

我修改了你的代码。

  • 添加了一个按钮,点击时会调用retrieve_input
  • retrieve_input应该有self参数。

您可以使用self.txt.get("1.0", tki.END)获取文字。使用str.splitlines()将行作为列表。

import tkinter as tki

class App(object):

    def __init__(self):
        self.root = tki.Tk()

    # create a Frame for the Text and Scrollbar
        txt_frm = tki.Frame(self.root, width=200, height=200)
        txt_frm.pack(fill="both", expand=True)

        # ensure a consistent GUI size
        txt_frm.grid_propagate(False)

        # implement stretchability
        txt_frm.grid_rowconfigure(0, weight=1)
        txt_frm.grid_columnconfigure(0, weight=1)

    # create a Text widget
        self.txt = tki.Text(txt_frm, borderwidth=3, relief="sunken")
        self.txt.config(font=("consolas", 12), undo=True, wrap='word')
        self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)

    # create a Scrollbar and associate it with txt
        scrollb = tki.Scrollbar(txt_frm, command=self.txt.yview)
        scrollb.grid(row=0, column=1, sticky='nsew')
        self.txt['yscrollcommand'] = scrollb.set

        tki.Button(txt_frm, text='Retrieve input', command=self.retrieve_input).grid(row=1, column=0)

    def retrieve_input(self):
        lines = self.txt.get("1.0", tki.END).splitlines()
        print(lines)

app = App()
app.root.mainloop()