2013-07-19 241 views
2

通過在Python中使用程序編程範式,我寫了一個程序,該程序逐行讀取文件的輸入(如File.txt)並將其打印出來。下面是實施例:如何從Python中的多行Tkinter文本框中讀取輸入(逐行)?

腳本:

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

結果:

注意:如果例如 「file.txt的」 含有2行,第一行作爲 'LINE1' 和第二line as'line2',then output is:

line1 
line2 

相同的結果我想通過面向對象的pro通過使用「Tkinter Multiline TextBox」而不是文件(在上面的示例File.txt中)來格式化Paradigm。

我有一個創建一個多Tkinter的文本框下面的代碼:

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的多行文本框」快到了,我進入了4條線Tkinter的文本框爲:

ABC 
XYZ 
PQR 
QAZ 

但我沒有得到確切想法/執行情況,我怎麼能讀取這些線形成Tkinter的文本框一個接一個地在我的程序中使用它們進行進一步的處理。

我使用的Python版本是3.0.1。 請幫忙...

回答

2

從文檔中,tkinter.textget方法將只返回字符串,包括新行\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() 
         ... 
    
+0

Text.get('0.0')只返回第一個字符。 – falsetru

+0

你確定嗎? doc告訴我,如果省略第二個參數,它將在第一個參數後返回字符。我會試試看看。@ falsetru – zhangyangyu

+0

我自己試了一下。你參考了哪些文件? – falsetru

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

謝謝你的代碼片段。它幫助我爲我的問題獲得IDEA。我會問你更多如果我會困在我的工作問題之間。謝謝 – AshA