habe folgendes Problem.
Habe mir für mein Commandozeilenprogramm einen GUI geschrieben.
Dazu habe ich den GUI als einzelnes Programm und importe dann mein Commandozeilenprogramm (ab hier nenne ich es mal CALC)
Jetzt habe ich für CALC aber einige Sachen die ich per "print" rauschreibe und im GUI anzeigen möchte.
Immo mache ich das so:
CALC:
Code: Alles auswählen
from optparse import OptionParser
def main(inputfolders, output = None):
if not output == None:
import sys
sys.stdout = output
#ganz viel anders Zeug...
if __name__ == "__main__":
inputfolders = []
inputfolders.append('test')
inputfolders.append('test2')
# Comamndline parser Kram
if options.main:
main(inputfolders)
(es sei erwähnt das das hier mein erstes wxPython Programm ist und dementsprechend hoch ist der Copy und Past Anteil, wem das Programm also bekannt vorkommt, nicht wundern, habe nur einige Zeilen verändert)
Code: Alles auswählen
#!/usr/bin/python
import os
import wx
import sys
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin
import CALC as lab
meas = []
inputpath = '/data/auger/amiga/hodoscope/'
for path, dirs, files in os.walk(inputpath):
if len(dirs) == 0:
#a = os.path.split(path) #Messnummer
#b = os.path.split(a[0]) # Datum
#c = os.path.split(b[0]) # Comments
#d = os.path.split(c[0]) # PMT
#measnumb = str(os.path.join(b[1] ,a[1]))
#meascomm = str(c[1])
#measpmt = str(d[1])
#meas.append((measnumb, meascomm, measpmt))
meas.append(path)
class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
CheckListCtrlMixin.__init__(self)
ListCtrlAutoWidthMixin.__init__(self)
class Repository(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(900, 400))
panel = wx.Panel(self, -1)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)
leftPanel = wx.Panel(panel, -1)
rightPanel = wx.Panel(panel, -1)
self.log = wx.TextCtrl(rightPanel, -1, style=wx.TE_MULTILINE)
self.list = CheckListCtrl(rightPanel)
self.list.InsertColumn(0, 'Path')
#self.list.InsertColumn(0, 'Date/Number', width=140)
#self.list.InsertColumn(1, 'Comment')
#self.list.InsertColumn(2, 'PMT')
for i in meas:
index = self.list.InsertStringItem(sys.maxint, i)
#self.list.SetStringItem(index, 1, i[1])
#self.list.SetStringItem(index, 2, i[2])
vbox2 = wx.BoxSizer(wx.VERTICAL)
sel = wx.Button(leftPanel, -1, 'Select All', size=(100, -1))
des = wx.Button(leftPanel, -1, 'Deselect All', size=(100, -1))
apply = wx.Button(leftPanel, -1, 'Apply', size=(100, -1))
self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=sel.GetId())
self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=des.GetId())
self.Bind(wx.EVT_BUTTON, self.OnApply, id=apply.GetId())
vbox2.Add(sel, 0, wx.TOP, 5)
vbox2.Add(des)
vbox2.Add(apply)
leftPanel.SetSizer(vbox2)
vbox.Add(self.list, 1, wx.EXPAND | wx.TOP, 3)
vbox.Add((-1, 10))
vbox.Add(self.log, 0.5, wx.EXPAND)
vbox.Add((-1, 10))
rightPanel.SetSizer(vbox)
hbox.Add(leftPanel, 0, wx.EXPAND | wx.RIGHT, 5)
hbox.Add(rightPanel, 1, wx.EXPAND)
hbox.Add((3, -1))
panel.SetSizer(hbox)
self.Centre()
self.Show(True)
def OnSelectAll(self, event):
num = self.list.GetItemCount()
for i in range(num):
self.list.CheckItem(i)
def OnDeselectAll(self, event):
num = self.list.GetItemCount()
for i in range(num):
self.list.CheckItem(i, False)
def OnApply(self, event):
num = self.list.GetItemCount()
inputfolders = []
for i in range(num):
if i == 0: self.log.Clear()
if self.list.IsChecked(i):
#path = os.path.join(inputpath, )
#measnumb = self.list.GetItemText(i)
#meascomm = self.list.GetItemText(i)
#measpmt = self.list.GetItemText(i)
#inputfolders.append(path)
inputfolders.append(self.list.GetItemText(i))
#self.log.AppendText(self.list.GetItemText(i) + '\n')
lab.main(inputfolders, self.log)
self.log.AppendText("Finished" + '\n')
#self.log.AppendText("%s" + '\n')
app = wx.App()
Repository(None, -1, 'Measurements')
app.MainLoop()
Das Problem ist nun, so wie es ist geht es.
Es zeigt alle "prints" an, aber erst NACHDEM CALC wieder beendet wurde.
Also sagen wir ich mache alle 100s "print 'Hallo'" und das 10 mal.
Dann passiert erst 1000s nichts um dann auf einen Schlag 10 mal Hallo anzuzeigen.
Da ich das ganze aber dazu benutzen möchte dem Benutzer zu zeigen wie weit das Programm bereits ist, ist dies etwas suboptimal.
Hoffe jemand kann mir einen Tipp geben.
bis später
p90