3

Python で手続き型プログラミング パラダイムを使用することにより、ファイル (File.txt など) の入力を 1 行ずつ読み取り、出力するプログラムを作成しました。以下に例を示します。

脚本:

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

結果:

注: たとえば、「File.txt」に 2 行が含まれている場合、最初の行が「line1」、2 行目が「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 からこれらの行を 1 つずつ読み取る方法と、マイ プログラムでさらに処理するためにそれらを使用する方法についての正確なアイデア/実装を得ていません。

私が使用しているPythonのバージョンは3.0.1です。助けてください...

4

2 に答える 2

3

ドキュメントから、getメソッド ontkinter.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()
            ...
    
于 2013-07-19T13:20:54.413 に答える
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()
于 2013-07-19T13:23:28.880 に答える