matplotlib, ScrolledPanel und Drucken

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo!

Ich habe in einem wx.ScrolledPanel mehrer Diagramme mit matplotlib dargestellt und möchte diese drucken. Leider funktioniert das nicht richtig, es wird nur ein minimaler Teil vom linken oberen Rand gedruckt.
Hier mal der Code:

Code: Alles auswählen

# -*- coding: latin1 -*-
import sys
import os

import wx
import wx.lib.scrolledpanel as SP
from wx.lib.mixins.listctrl import CheckListCtrlMixin
import wx.lib.mixins.listctrl as listmix

import pylab
from matplotlib.backends.backend_wx import FigureCanvasWx
from matplotlib.font_manager import fontManager, FontProperties


class CheckListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
    def __init__(self, parent, nr):
        wx.ListCtrl.__init__(self, parent, -1, size=(900, ((nr*8)+50)), 
style=wx.LC_REPORT|wx.LC_VRULES|wx.LC_HRULES)
        listmix.ListCtrlAutoWidthMixin.__init__(self)

class MyFrame(wx.Frame, listmix.ColumnSorterMixin):

    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Results", size=(300, 300))
        self.panel = SP.ScrolledPanel(self, -1)
        self.panel.SetBackgroundColour('WHITE')

        d = {1:('test','22')}
        nr = 1
        self.list = CheckListCtrl(self.panel, nr)
        self.list.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL))

        self.b = wx.Button(self.panel, 10, "Copy to clipboard")
        self.b.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL))
        self.Bind(wx.EVT_BUTTON, self.to_clipboard, self.b)

        l1 = wx.StaticText(self.panel, -1, "RNAi Scan Results")
        l1.SetFont(wx.Font(16, wx.SWISS, wx.NORMAL, wx.NORMAL))
        dummy = wx.StaticText(self.panel, -1, "")

        self.fig = pylab.figure(figsize=(10,8))
        self.fig.subplots_adjust(hspace = 0.5, left=0.07, right=0.95, 
top=0.93)
        self.canvas = FigureCanvasWx(self.panel, -1, self.fig)

        self.vbox = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.GridBagSizer(hgap = 10, vgap = 10)

        sizer.Add(l1, pos = (0, 1), flag = wx.ALIGN_CENTER)
        sizer.Add(self.list, pos = (1, 1), span = (2,1), flag = 
wx.EXPAND|wx.GROW|wx.ALIGN_CENTER)
        sizer.Add(self.b, pos = (1, 2))
        sizer.Add(self.canvas, pos = (3, 1), flag = 
wx.EXPAND|wx.GROW|wx.ALIGN_CENTER)
        sizer.Add(dummy, pos = (4, 1), flag = 
wx.EXPAND|wx.GROW|wx.ALIGN_CENTER)

        self.vbox.Add(sizer, 1, wx.ALL|wx.ALIGN_CENTER,10)

        self.panel.SetSizer(self.vbox)
        self.panel.SetAutoLayout(1)
        self.panel.SetupScrolling()

        self.list.InsertColumn(0, "ID")
        self.list.InsertColumn(1, "All Hits")
        self.list.InsertColumn(2, "Efficient Hits")
        for key, data in d.iteritems():
            index = self.list.InsertStringItem(sys.maxint, data[0])
            self.list.SetStringItem(index, 1, data[1])
            self.list.SetItemData(index, key)
        self.list.SetColumnWidth(0, 200)
        self.list.SetColumnWidth(1, 100)
        self.list.SetColumnWidth(2, 150)

        self.Show()
        self.ShowFullScreen(True, style = wx.FULLSCREEN_NOMENUBAR)

        self.Build_Menus()
        self.plot_data(self.fig)

    def Build_Menus(self):
        """ build menus """
        MENU_EXIT  = wx.NewId()
        MENU_SAVE  = wx.NewId()
        MENU_PRINT = wx.NewId()
        MENU_PSETUP= wx.NewId()
        MENU_PREVIEW=wx.NewId()
        MENU_CLIPB  =wx.NewId()
        MENU_HELP   =wx.NewId()

        menuBar = wx.MenuBar()

        f0 = wx.Menu()
        f0.Append(MENU_SAVE,   "&Export",   "Save Image of Plot")
        f0.AppendSeparator()
        f0.Append(MENU_PSETUP, "Page Setup...",    "Printer Setup")
        f0.Append(MENU_PREVIEW,"Print Preview...", "Print Preview")
        f0.Append(MENU_PRINT,  "&Print",           "Print Plot")
        f0.AppendSeparator()
        f0.Append(MENU_EXIT,   "E&xit", "Exit")
        menuBar.Append(f0,     "&File");

        f1 = wx.Menu()
        f1.Append(MENU_HELP, "Quick Reference",  "Quick Reference")

        menuBar.Append(f1, "&Help");

        self.SetMenuBar(menuBar)

        self.Bind(wx.EVT_MENU, self.onPrint, id=MENU_PRINT)
        self.Bind(wx.EVT_MENU, self.onPrinterSetup, id=MENU_PSETUP)
        self.Bind(wx.EVT_MENU, self.onPrinterPreview, id=MENU_PREVIEW)
        self.Bind(wx.EVT_MENU, self.save, id=MENU_SAVE)
        self.Bind(wx.EVT_MENU, self.onExit , id=MENU_EXIT)
        self.Bind(wx.EVT_MENU, self.onHelp, id=MENU_HELP)

    def onPrinterSetup(self,event=None):
        self.canvas.Printer_Setup(event=event)

    def onPrinterPreview(self,event=None):
        self.canvas.Printer_Preview(event=event)

    def onPrint(self,event=None):
        self.canvas.Printer_Print(event=event)

    def onHelp(self, event=None):
        pass

    def onExit(self,event=None):
        self.Destroy()

    def save(self, event):
        pass

    def to_clipboard(self, evt):
        f = open("data_hits.txt", "r")
        msg = 'Id' + '\t' + 'All Hits' + '\t' 'Eff Hits' + '\n' + f.read()
        f.close()
        data = wx.TextDataObject()
        data.SetText(msg)
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(data)
            wx.TheClipboard.Flush()
            wx.TheClipboard.Close()

    def plot_data(self, figure):
        query_plot = figure.add_subplot(1, 1, 1)
        listex = [0,1,2,3]
        listey = [0,1,2,3]
        query_plot.plot(listex,listey)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show(True)
    app.MainLoop()
Hat jemand eine Idee, woran das liegen könnte?

Liebe Grüsse
Stefanie
http://www.snowflake-sl.info/index.html
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Stefanie,

um ehrlich zu sein, habe ich keine direkte Ahnung. Aber vielleicht hilft Dir
folgende Idee (aus einem meiner Programme).

Ich habe schon seit einer Weile den Eindruck, als ob das matplotlib-backend an der Stelle einen Bug hat, habe mir aber nicht die Mühe gemacht es einzugrenzen. Falls hier niemand auf eine Idee kommt oder eine Lösung weiß, magst Du vielleicht auf einer Mailingliste zu mpl oder wxPython nachfragen.

Im Übrigen probier mal:

Code: Alles auswählen

        self.fig = Figure(figsize=(7, 6), dpi=100)
        self.axes = self.fig.add_subplot(111)
        self.canvas = FigureCanvas(self, -1, self.fig)
wobei FigureCanvas der Canvas Deiner Wahl ist. Ich nehme FigureCanvasWxAgg aus matplotlib.backends.backend_wxagg, aber das ist Geschmackssache.

HTH
Christian
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo Christian!

Danke für die Antwort, ich werd mir dein Code mal anschauen. In der mpl mailing list konnte niemand helfen, evtl. probier ichs nochmal bei wx.

Liebe Grüsse
Stefanie
http://www.snowflake-sl.info/index.html
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ah, sorry. Ich verfolge die Mailinglisten zur Zeit nicht.

Mein Code ermöglicht natürlich nur das Abspeichern des Canvas als Bild - das sei gesagt, für diejenigen, die den Thread später mal lesen. Das Bild muß man denn gesondert öffnen und drucken.

Gruß,
Christian
Antworten