2012-04-27 20 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) 

我消除了大部分代碼,以上是給我帶來麻煩的地方。如何從Process類或MainFrame類中的函數中更改MainFrame類中的self.srcTc?如果沒有源於MainFrame類的處理程序,實際上指向self.srcTc時遇到了問題。

回答

1

我想你想要什麼有看起來像這樣的事情(不工作的例子):

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

使用MainFrame.sPath = ...你沒有真正改變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

對不起,我不清楚例子,但您的建議已運作得在一定程度上。我現在可以在Process類的MainFrame類的TextCtrl中設置SetValue和GetValue。但它不會在屏幕上更新。 – wtfomgjohnny 2012-04-27 15:38:03

+0

@wtfomgjohnny你的問題似乎與在Python中的OOP通常不是與wxPython和GUI(從我可以在這裏看到的)。這裏只是一個猜測:你在調用'wx.App'實例的'.MainLoop()'方法嗎?沒有一個工作的例子,我看不到問題... – jadkik94 2012-04-27 15:42:07

+0

這裏是我的實施你的建議的完整代碼。 http://pastebin.com/aWr0fse0 – wtfomgjohnny 2012-04-27 15:44:30

2

有幾種方法可以完成這種事情。您可以將句柄傳遞給面板類,該面板類可以調用父類中需要的任何設置值(即parent.myTxtCtrl.SetValue(val)),也可以使用pubsub。我個人推薦後者,因爲它更靈活,並且在更改程序時不易破損。我寫了下面的教程,應該讓你加快速度:http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

+0

謝謝Mike,我已經閱讀了很多你的教程和文章,他們確實很有幫助。 現在我正在使用jadkik94的方法,它的工作原理除了實際的TextCtrl不顯示文本。它被分配了一個值,我可以調用GetValue()並讓它返回正確的信息,但它不會將它寫入實際框中。 – wtfomgjohnny 2012-04-27 15:40:06