0

私は、独自の基本的な Python IDE を作成しようとしてきました。構文を入力できる入力テキスト ボックスと、Python インタープリターからの結果の出力を表示する pmw.ScrolledText を含むインターフェイスを作成しました。

私が本当に望んでいるのは、これら 2 つのウィジェットを組み合わせて、入力と出力の両方を処理できる単一のウィジェットにすることです。そのようなウィジェットは見つかりませんでしたが、Idle は Tk で記述されており、基本的にアプリケーションで探しているものであるため、何らかの方法でこれを行うことができると確信しています。Idle のソース コードを調べても、これを行うための簡潔な方法はわかりません。

基本的に、入力を受け取り、出力を表示できる pmw.ScrolledText のようなものを探しています。

これがTkで可能かどうか、そしてそれを機能させるために取られる可能性のあるルートに関するアイデアがあるかどうか疑問に思っています。

ありがとう。

4

1 に答える 1

3

それは間違いなく可能です。使用したいのはテキスト ウィジェットですが、プロンプトの表示を処理し、ユーザーがリターン キーを押したときにアクションを実行するために、いくつかのコーディングを行う必要があります。

プロンプトを挿入した直後にマークを設定し、リターンキーを検出したら、そのマークからファイルの最後までを実行するコマンドとして取得するのが最も簡単な方法だと思います。

このテクニックを説明する簡単な例を次に示します。完全ではありませんが (たとえば、プロンプトを削除できます)、一般的な考え方を示しています。

import Tkinter as tk

class Application(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.text = tk.Text(self, wrap="word", height=20)
        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set)
        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

        self.text.bind("<Return>", self.process_input)
        self.prompt = ">>> "

        self.insert_prompt()

    def insert_prompt(self):
        # make sure the last line ends with a newline; remember that
        # tkinter guarantees a trailing newline, so we get the
        # character before this trailing newline ('end-1c' gets the
        # trailing newline, 'end-2c' gets the char before that)
        c = self.text.get("end-2c")
        if c != "\n":
            self.text.insert("end", "\n")
        self.text.insert("end", self.prompt, ("prompt",))

        # this mark lets us find the end of the prompt, and thus
        # the beggining of the user input
        self.text.mark_set("end-of-prompt", "end-1c")
        self.text.mark_gravity("end-of-prompt", "left")

    def process_input(self, event=None):
        # if there is an event, it happened before the class binding,
        # thus before the newline actually got inserted; we'll
        # do that here, then skip the class binding.
        self.text.insert("end", "\n")
        command = self.text.get("end-of-prompt", "end-1c")
        self.text.insert("end", "output of the command '%s'...!" % command)
        self.text.see("end")
        self.insert_prompt()

        # this prevents the class binding from firing, since we 
        # inserted the newline in this method
        return "break"

root = tk.Tk()
root.wm_geometry("400x100")
app = Application(root).pack(side="top", fill="both", expand=True)

root.mainloop()
于 2013-07-24T16:48:51.573 に答える