2012-04-27 3 views
0

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

現在、私は行を読み、それをソースパス変数(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を指すのに問題があります。

答えて

1

は、私が何をしたいこと(実施例なし)そのようなことのように見えるように持っていると思う:

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

が、クラスに、あなたが実際にあなたが作成したメインフレームにSPATHを変更していないMainFrame.sPath = ...を使用してそれ自身を作成し​​た後、参照を格納せずに(例えば変数に代入するなど)MainFrame()に作成します。だから、あなたはselfとしてクラス自体の "内部"以外の場所からアクセスすることはできません。

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

UPDATE:あなたからのコードスニペット、あなたがファイルの最後に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) 

今こうして、それは動作するはずです、あなたが何をすべき

は、この、あなたのファイルの終わりです。 問題は、別のフレームを作成し、パスを変更してテキストを更新しているが、表示していないということでした。修正は、表示されている実際のウィンドウを保存し、これを更新することです。

+0

申し訳ありませんが、あなたの提案はある程度はうまくいきました。 MainFrameクラスのTextCtrlのSetValueとGetValueをProcessクラスから取得できるようになりました。ただし、画面上では更新されません。 – wtfomgjohnny

+0

@wtfomgjohnnyあなたの問題は、一般的にはwxPythonとGUIではなく(私がここから見ることができる)PythonのOOPにあるようです。ここでの推測です: 'wx.App'インスタンスの' .MainLoop() 'メソッドを呼び出していますか?実際の例がなければ、私は問題を見ることができません... – jadkik94

+0

ここにあなたの提案の私の実装と完全なコードです。 http://pastebin.com/aWr0fse0 – wtfomgjohnny

2

このようなことを達成する方法はいくつかあります。親クラスで必要なものを呼び出して値を設定できる(つまりparent.myTxtCtrl.SetValue(val))か、pubsubを使用できるパネルクラスにハンドルを渡すことができます。私は個人的には後者をお勧めします。プログラムを変更すると、柔軟性が高く、破損しにくいからです。私は以下のチュートリアルを書いてスピードを上げてください:http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

+0

マイクありがとう、私は実際にあなたのチュートリアルや記事の多くを読んできました。 今はjadkik94のメソッドを使用していますが、実際のTextCtrlではテキストは表示されません。 GetValue()を呼び出して正しい情報を返すことができますが、実際のボックスには書き込んでいません。 – wtfomgjohnny

関連する問題