hallo
ich hänge irgendwie immernoch an diesem problem, vlt weiss einer was und kann mir vlt auf die sprünge helfen... ich hab aus dem code mal alles rausgenommen was erst mal nicht zu dem problem gehört aber auf wunsch kann ich gerne den kompletten code nochmal linken.
und zwar will ich folgendes machen. ich brauch ein interface mit 4 plots. in einem ist eine random funktion und in den anderen 3 wird der fortschritt der näherung angezeigt. was ich nun will ist: das ich durch start und stop die iterationen anhalten kann bzw. weiterlaufen lassen.
mein problem ist, dass sich das interface immer komplett einfriert wenn ich start drücke...
zu meinem code:
ich hab nur die thread-class drin gelassen um zu zeigen wie ich den update machen will. danach kommt die mainclass in der der canvas erstellt wird etc. allerdings hab ich die iterate funtion etc leer gelassen; ausserdem hab ich die initalisierungen der grafiken etc rausgenommen also es geht mir grad nur um das prinzipielle , also wie ich diesen mechanismus hinbekomme dass er mir nach jedem iterationsschritt die 3 grafen updated und ich weiterin auf das interface zugreifen kann
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf8 -*-
######## imports ###########
#
import matplotlib
matplotlib.use("WXAgg")
matplotlib.interactive(True)
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.figure import Figure
from matplotlib.axes import Subplot
import matplotlib.pyplot as plt
import numpy as np
import pylab as pl
import math
import wx
from threading import Thread
import threading
import time
#
###########################
wx.SetDefaultPyEncoding("iso-8859-15")
class ThreadedAction(Thread):
def __init__(self, em_obj, **kwargs):
Thread.__init__(self, **kwargs)
self.em_obj = em_obj
def run(self):
print "Performing expensive calculation in %s..."%self.getName()
while (not self.em_obj._converged and not self.em_obj.stop):
self.em_obj.iterate()
# er soll iterieren und nach jedem iterationsschritt mir die grafiken updaten
wx.CallAfter(self.em_obj.updateGUI)
####################################################################################
#
class EM_MoG(wx.Frame):
def __init__(self, task):
wx.Frame.__init__(self, None, -1, "Interactive Frame v1.0")
self.fig = Figure((10,10), 75)
self.canvas = FigureCanvasWxAgg(self, -1, self.fig)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.canvas, 1, wx.TOP)
##############################################################################
# hier werden die 4 grafiken initialisiert
self.a = self.fig.add_subplot(221)
#self.a.axes.plot(self._pdf_x, self._y_gen)
# initialisiere die plot-frames
self.b = self.fig.add_subplot(223)
self.c = self.fig.add_subplot(222)
self.d = self.fig.add_subplot(224)
################### Controller ######################
#
# create start/stop buttons
self.button_start = wx.Button(self,-1, " Start ", size=(-1,-1))
self.button_stop = wx.Button(self,-1, " Stop ", size=(-1,-1))
self.button_exit = wx.Button(self,-1, " Exit ", size=(-1,-1))
self.cb1 = wx.CheckBox(self, -1, "Show title" )
# bind actions to the buttons
self.button_start.Bind(wx.EVT_BUTTON,self.OnStart)
self.button_stop.Bind(wx.EVT_BUTTON, self.OnStop)
self.button_exit.Bind(wx.EVT_BUTTON, self.OnExit)
# pack the buttons in the Sizer
btnsizer = wx.BoxSizer(wx.HORIZONTAL)
btnsizer.Add(self.button_start, 1, wx.LEFT)
btnsizer.Add(self.button_stop, 1, wx.LEFT)
btnsizer.Add(self.button_exit, 1, wx.RIGHT)
btnsizer1 = wx.BoxSizer(wx.VERTICAL)
btnsizer1.Add(self.cb1, 1, wx.DOWN)
sizer.Add(btnsizer, 0, wx.TOP)
sizer.Add(btnsizer1, 0, wx.TOP)
self.SetSizer(sizer)
self.Fit()
#
#####################################################
# create stop-flag for multithreading
self.stop = False
def iterate(self):
# hier kommt die iteration welche aus dem thread aufgerufen wird...
pass
def updateGUI(self):
# hier soll das interface updated werden, wird aufgerufen mit callafter
# plot pdf obtained by em-step
#self.canvas.draw()
#self.b.axes.plot(self._pdf_x, self._y_em)
#print 'udone.'
# plot history of parameters (idea of Omid!!)
#self.d.axes.plot(self._theta_history[:self._counter-1, :])
#self.canvas.draw()
# plot history of likelihood
#self.c.axes.plot(self._log_likelihood[:self._counter])
#self.canvas.draw()
#self.canvas.Refresh()
#self.canvas.Update()
pass
def OnStop(self,event=None):
pass
def OnStart(self,event=None):
self.stop = False
action = ThreadedAction(self)
action.start()
def OnExit(self,event=None):
self.Destroy()
def iterate_until_converged(self):
while (not self._converged):
self.iterate()
if __name__ == '__main__':
app = wx.PySimpleApp(0)
frame = EM_MoG('d')
frame.Show(True)
app.MainLoop()