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

Я исключил большую часть кода, и что выше, где он причиняет мне неприятности. Как изменить self.srcTc в классе MainFrame либо из класса Process, либо из функции в классе MainFrame? У меня возникают проблемы с фактическим указанием на self.srcTc без обработчика, который связан с классом MainFrame.

ответ

1

Я думаю, что вы хотите, должен выглядеть как-то вроде этого (без рабочего примера):

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

при использовании MainFrame.sPath = ... вы на самом деле не меняющийся SPATH к MainFrame вы создали, но в классе сам, тогда вы его создаете, в 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

Извините за неясные примеры, но ваше предложение в какой-то мере сработало. Теперь я могу SetValue и GetValue в TextCtrl в классе MainFrame из класса Process. Однако он не обновляется на экране. – wtfomgjohnny

+0

@wtfomgjohnny Ваша проблема, похоже, связана с OOP в Python вообще не с wxPython и GUI (из того, что я вижу здесь). Просто угадайте здесь: вы вызываете метод '.MainLoop()' 'wx.App''? Без рабочего примера я не вижу проблемы ... – 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