arty.net (Normal User)
Newbie
Messaggi: 2
Iscritto: 14/05/2010
|
Ho un problema con questo codice :
Codice:
Codice sorgente - presumibilmente Python |
#!/usr/bin/env python # -*- coding: utf8 -*- import random import wx import os # Operating System dependent call import sys import cPickle as p import csv import thread # Define dialog component ID_EXIT = 98 ID_CALCULATE = 99 ID_PLOT = 100 ID_CLOSE = 101 ID_CLEAR_TERM = 102 ID_RESET = 103 ID_CALCULATE_SINGLE = 104 def formatta(valore): tmp = str("%.1f" % valore) if tmp == "-0.0": return tmp.replace("-","") else: return tmp class MainWindow(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, wx.ID_ANY, title, size=(600, 600),pos = (200,100)) #Creates a menu filemenu1=wx.Menu() filemenu1.AppendSeparator() filemenu1.Append(ID_EXIT, "&Exit", "Terminate the program") # Creating the menubar menuBar=wx.MenuBar() menuBar.Append(filemenu1, "&File") #Adding the filemenu to the MenuBar self.SetMenuBar(menuBar) #Adding the MenuBar to the Frame content #self.control = wx.TextCtrl(self, 1, style=wx.TE_MULTILINE) self.CreateStatusBar() # A statusbar in the bottom of the window mod = ['B-ASK','4-ASK','8-ASK','BPSK','Q-PSK','8-PSK','Sunde FSK','QAM-16','QAM-64','QAM-256'] incr = ['1.0', '0.5', '0.2','0.1'] wx.StaticText(self, -1, "Scegliere la modulazione :",(50,30)) self.combo1 = wx.ComboBox(self, -1, pos=(50, 70), size=(150, -1), choices=mod, value='B-ASK', style=wx.CB_READONLY) wx.StaticText(self, -1, "Scegliere i valori minimo e massimo di Eb/N0 (db):",(50,120)) wx.StaticText(self, -1, "Minimo :",(50,175)) wx.StaticText(self, -1, "Massimo :",(210,175)) self.txt1 = wx.TextCtrl(self, -1, '0',(120,170)) self.txt2 = wx.TextCtrl(self, -1, '10',(290,170)) wx.StaticText(self, -1, "Scegliere l'incremento :",(50,240)) self.combo2 = wx.ComboBox(self, -1, pos=(50, 280), size=(150, -1), choices=incr, value='1.0', style=wx.CB_READONLY) #wx.Button(self, ID_CLOSE, 'Close', (500, 540)) self.btn1 = wx.Button(self, ID_CALCULATE, 'Calculate', (50, 340)) self.btn2 = wx.Button(self, ID_PLOT, 'Plot', (150, 340)) self.btn3 = wx.Button(self, ID_RESET, 'Reset', (250, 340)) self.btn4 = wx.Button(self, ID_CLEAR_TERM, 'Clear Terminal', (350, 340)) wx.StaticText(self, -1, "CALCOLO DI UN SOLO VALORE DEL BER :",(50,400)) wx.StaticText(self, -1, "Inserire il valore di Eb/N0 (db) :",(50,430)) wx.StaticText(self, -1, "Eb/N0 (db) :",(50,475)) self.txt3 = wx.TextCtrl(self, -1, '0',(150,470)) self.btn5 = wx.Button(self, ID_CALCULATE_SINGLE, 'Calculate single', (250, 465)) #self.rb2 = wx.RadioButton(self, -1, 'Off', (400, 395), style=wx.RB_GROUP) #self.rb1 = wx.RadioButton(self, -1, 'On', (350, 395),) #self.Bind(wx.EVT_RADIOBUTTON, self.disable_all, id=self.rb1.GetId()) #self.Bind(wx.EVT_RADIOBUTTON, self.enable_all, id=self.rb2.GetId()) wx.EVT_MENU(self, ID_EXIT, self.OnClose) wx.EVT_BUTTON(self, ID_CALCULATE, self.miothread1) #wx.EVT_BUTTON(self, ID_PLOT, self.miothread2) wx.EVT_BUTTON(self, ID_RESET, self.reset) wx.EVT_BUTTON(self, ID_CLEAR_TERM, self.clear_term) #wx.EVT_BUTTON(self, ID_CALCULATE_SINGLE, self.miothread3) self.enable_all(True) self.frame2 = Risultati(None,-1,"Risultati") self.frame2.Show(True) def disable_all(self,e): self.combo1.Disable() self.combo2.Enable() self.txt1.Enable() self.txt2.Enable() self.btn1.Disable() self.btn2.Disable() #self.btn3.Disable() #self.btn4.Disable() self.txt3.Enable() self.btn5.Enable() def enable_all(self,e): self.combo1.Disable() self.combo2.Enable() self.txt1.Enable() self.txt2.Enable() self.btn1.Enable() self.btn2.Disable() self.btn3.Enable() #self.btn4.Enable() self.txt3.Disable() self.btn5.Disable() def OnClose(self, e): self.Close(True) self.frame2.Close(True) #def calcolo(self,objMod,DeMod,titolo,minimum,maximum,incremento): def calcolo(self,e): i = minimum = float(self.txt1.GetValue()) maximum = float(self.txt2.GetValue()) incremento = float(self.combo2.GetValue()) print 'min value = '+str(float(minimum)) print 'max value = '+str(float(maximum)) print 'increase = '+str(incremento) print '---------------Results---------------' self.frame2.log.AppendText('min value = '+str(float(minimum))+'\n'+'max value = '+str(float(maximum))+'\n'+'increase = '+str(incremento)+'\n'+'---------------Results---------------\n') while True: if i <= maximum: self.frame2.LogMessage2(formatta(i)) print i i += incremento else: break #print 'Ber calculation done !' #self.frame2.LogMessage_single('Ber calculation done !') #self.frame2.log.AppendText('Ber caculation done !') def clear_term(self,e): cmd = 'clear' os.system(cmd) self.frame2.log.Clear() def reset(self,e): os.system('rm ./sys/incremento.csv') os.system('rm ./sys/titolo.csv') os.system('rm ./risultati.csv') os.system('rm ./db.csv') #os.system('rm ./risultati.txt') #os.system('rm ./db.txt') def miothread1(self,e): thread.start_new_thread(self.calcolo, (0,)) class Risultati(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title) panel = wx.Panel(self) self.log = wx.TextCtrl(panel, -1, "",style=wx.TE_MULTILINE) self.log.SetEditable(False) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.log, 1, wx.EXPAND|wx.ALL, 5) #self.SetSizer(box) panel.SetSizer(box) def LogMessage(self, msg1, msg2): self.log.AppendText(msg1+' : '+msg2+'\n') def LogMessage2(self, msg1): self.log.AppendText(msg1+'\n') #class MyApp(wx.App): #def OnInit(self): #frame=MainWindow(None, -1, "BER Tool AWGN") #frame.Show(True) ##frame2 = Risultati(None,-1,"Risultati") ##frame2.Show(True) #self.SetTopWindow(frame) #return True app = wx.App() frame=MainWindow(None, -1, "BER Tool AWGN") frame.Show(True) app.MainLoop()
|
E' la semplice stampa di un ciclo while su un secono frame chiamato Risultati, comandato dal frame principale. Premendo il tasto Calculate si avvia il ciclo e viene stampato sul TextCtrl del frame Risultati. Voglio inoltre che per il ciclo venga usato un altro thread rispetto a quello principale del programma. Ottengo molto spesso (nel 50% dei casi ) gli errori
Codice sorgente - presumibilmente Plain Text |
oppure
Codice sorgente - presumibilmente Plain Text |
(python:11242): Gtk-CRITICAL **: gtk_text_layout_wrap_loop_start: assertion `layout->one_style_cache == NULL' failed
(python:11242): Gtk-CRITICAL **: gtk_text_layout_wrap_loop_end: assertion `layout->wrap_loop_count > 0' failed
|
come devo fare per evitare gli errori ? Non li fa sempre ma č proprio questo che devo risolvere, specialmente per innestare in seguito del codice + complesso....Girovagando in giro su internet ho visto che probabilmente č dovuto al fatto che sia il ciclo che l'AppendText sul frame Risultati sono governtati dallo stesso thread ( nuovo, che creo con la classe thread).
http://www.daniweb.com/forums/thread273160.html
E' possibile ? Esiste un modo per risolverlo ? grz in anticipo |