1

探しているものが見つからないため、間違った用語を使用してグーグルで検索しているに違いありません。どんな助けでも感謝します。

textctrl 内の特定の行に書き込むにはどうすればよいですか?

現在、私のプログラムはファイルを処理しています。処理されると、ファイルはテキスト ctrl 内にリストされます。私が達成したいのはこれです。名前の後に処理という単語を付けて、textctrl 内にファイルを一覧表示します。処理されたら、まったく同じ位置に書き直す必要がありますが、今回は処理という単語を完了という単語に置き換えます。また、どのファイルがどの行に出力されるかを覚えておく必要があります。私はスレッド化しているので、ファイルはサイズが異なるため、必ずしも開かれた順序で終了するとは限りません。

助けてくれてありがとう!

# This function opens files for processing.
def Encrypt(self, event):
    """
    Runs the thread
    """
    self.file2process = ""
    dlg = wx.FileDialog(self, "Select files", self.file2process, "", "*.*", wx.OPEN |wx.MULTIPLE | wx.CHANGE_DIR)

    if dlg.ShowModal() == wx.ID_OK:
        self.file2process = dlg.GetPaths()

    for fname in self.file2process:
        EncryptThread(fname)

# This is one of two functions that I would need to modify but same prociple would   apply to both so only including this one.

def run(self):
    """Run Worker Thread."""
    # This is the code executing in the new thread.

    keys = {char: chr(i) for i, char in enumerate(self.key)}

    with open(self.fname,'r') as f:
        with open(self.fname + '.tmp', 'w') as temp:        
            for data in f:
                match = ''.join([keys[char] for char in data if char in keys])
                temp.write(match)

    os.remove(self.fname)
    os.rename(self.fname + '.tmp', self.fname)

    msg = self.fname
    wx.CallAfter(Publisher().sendMessage, "update", msg)

# This function updates the textctrl.
def updateDisplay(self, msg):
    """
    Receives data from thread and updates the display
    """
    data = msg.data + "\n"
    self.updateText.WriteText(data)
4

2 に答える 2

1

TextCtrl に書き込むプロセスと、文字列を保存して操作するプロセスの 2 つの異なるプロセスを混同しているようです。正気を保つために、GUI 設計ではこれら 2 つのプロセスを分離する必要があります。

私の提案は、ファイルをTextCtrlに追加すると同時に、処理されたファイルのリストをリストに保存することです。reその後、リスト内包表記とモジュールを使用して、そのリストを非常に簡単に操作できます。この追加されたすべての操作により、wxPython の神々が意図したように、TextCtrl ウィジェット内のテキストが邪魔されずに維持されます。

あなたが何をしているのかを示すコードを提供できれば、より明確な例を提供できます。

于 2013-09-10T18:04:27.407 に答える
0

テキスト コントロールは、行アドレス指定可能なベースではなく、新しい行を含む可能性のある文字バッファーによって編成されます。wx.Grid コントロールを使用するか、名前の位置を覚えておく必要があるため、その位置の文字数も覚えておく必要があります。 wait フラグと done フラグは同じ長さです。

于 2013-09-10T18:05:54.437 に答える