wx gui multithreadding linux

Plattformunabhängige GUIs mit wxWidgets.
Antworten
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

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()

Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Schmeiß erstmal die Leerzeilen raus, das kann ja kein Mensch lesen!
EDIT: Im paste sind sie noch drin...
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

hmmm was meinst du damit denn genau ?
Antworten