0

ファイルをバッチ処理する小さなプログラムがあります。これらのファイルは、マップファイルを使用して特定の設定をロードします。マップファイルの上部には、それがどのディレクトリ用であるかを指定する行があります。

現在、この行を読み取って、ソースパス変数(sPath)に割り当てることができます。ソースディレクトリのTextCtrlを更新したいのですが、それはMainFrameクラスにあり、マップファイルを別のクラスにロードします。

class Process(wx.Panel):

    def loadMap(self, event):
    MainFrame.sPath = str(mapFile.readline()).strip("\n")
    MainFrame.loadSource(MainFrame())

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="DICOM Toolkit", size=(800,705))
        self.srcTc = wx.TextCtrl(self.panel, 131, '', size=(600,25), style=wx.TE_READONLY)

    def loadSource(self):
        self.srcTc.SetValue(MainFrame.sPath)

私はほとんどのコードを削除しました、そして上記のものはそれが私に問題を与えているところです。MainFrameクラスのself.srcTcをProcessクラスまたはMainFrameクラスの関数から変更するにはどうすればよいですか?MainFrameクラスに由来するハンドラーなしで実際にself.srcTcを指すのに問題があります。

4

2 に答える 2

2

この種のことを達成するには、いくつかの方法があります。値を設定するために親で必要なものを呼び出すことができるパネル クラスにハンドルを渡すことができます (つまり、parent.myTxtCtrl.SetValue(val) )。または、pubsub を使用できます。個人的には後者をお勧めします。より柔軟で、プログラムを変更しても破損しにくいからです。私は次のチュートリアルを書きました

于 2012-04-27T15:26:53.467 に答える
1

私はあなたが望むものはそのようなもののように見えなければならないと思います(実用的な例なしで):

class Process(wx.Panel):
    def loadMap(self, event):
        frame = MainFrame()
        frame.sPath = str(mapFile.readline()).strip("\n")
        frame.loadSource()

使用MainFrame.sPath = ...する場合、実際にsPathを作成したメインフレームに変更するのではなく、クラス自体に変更します。次に、sPathへMainFrame()の参照を保存せずに作成します(たとえば、変数に割り当てます)。したがって、クラス自体の「内部」以外の場所からはアクセスできませんself

解決策は、のインスタンスを作成してMainFrame操作することです。作成して変数に割り当てると、.sPath属性を操作してを呼び出すことができますloadSource()

更新:コードスニペットからMainFrame、ファイルの最後にインスタンスを作成しているようです:MainFrame().Show()、次にloadMapメソッドで新しいインスタンスを作成します。

あなたがすべきことは、あなたのファイルの最後にあるこれです:

app = wx.App(0)
#MainFrame().Show()
mainFrame = MainFrame() # or, insteadof making it a global variable, pass it as an argument to the objects you create, or store a reference to it anywhere else.
mainFrame.Show()
app.MainLoop()

loadMapメソッドで:

def loadMap(self, event):
    global mainFrame # or wherever you stored the reference to it
    # ...
    # remove this:
    # mainFrame = MainFrame()
    # set the sPath to the OBJECT mainFrame not the CLASS MainFrame
    mainFrame.sPath = str(mapFile.readline()).strip("\n")
    mainFrame.srcTc.SetValue(MainFrame.sPath)

これで、このように機能するはずです。問題は、別のフレームを作成し、そのパスを変更し、そのテキストを更新しているが、それを表示していないことでした。修正は、表示されている実際のウィンドウを保存し、これを更新することです。

于 2012-04-27T15:21:09.850 に答える