IT NEWS PC REVUE PC FORUM FreeBSDInternet time: @820
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

RIBANA trade - plastové okná

Kvalita v oblasti výplní otvorov. Žalúzie, rolety, sieťky, garážové brány. www.ribanatrade.sk

Zbavte sa viazanosti

Za Xperia Mini Pro so strieborným O2 Paušálom zaplatíte teraz 53 €! pausal.o2.sk

Vdd Orava - okná, dvere

Eurookná, plast.okná, nábytok, okenice, schodiská, inter. a exter. dvere www.vddorava.sk

Priprav sa na futbalové EURO

Exkluzívna súťaž o Ford Fiesta! Kurzová superponuka a bonus 100€ https://www.tipsport.sk

Odstráňte jedy z organizmu

ktoré spôsobujú alergie, závažné ochorenia a zdravotné problémy. www.detoxipan.sk

GTK bežiaci text (python)

Zaslať odpoveď
AutorSpráva
miso128
Užívateľ
Užívateľ

Založený: 30.07.2011
Príspevky: 3

PríspevokZaslal: So 30.07.11 9:19Odpovedať s citátomNávrat hore

Ahoj!

Mám za úlohu urobiť informačnú obrazovku, ktorej súčasťou bude na spodnom okraji obrazovky bežiaci text.
Rozhodol som sa pre použitie GTK (hlavne pre parsovanie html značiek v gtk.Label.set_markup()).

Celý text mám v gtk.Label. Skúšal som ho posúvať pomocou vloženia do gtk.Fixed a potom fixed.move(...,0,0),fixed.move(...,-1,0),fixed.move(...,-2,0),.............

potom som skúšal použitím gtk.Viewport. Oba spôsoby zlyhali, text začalo sekať, keď programu došla fyzická pamäť (dôsledkom bežiaceho textu) a začal zapisovať do swap.

Máte prosím nejaké iné riešenie? V pythone a s použitím GTK programujem asi iba týždeň, nič iné ma nenapadá. Za každú radu budem vdačný!
Zobraziť informácie o autoroviOdoslať súkromnú správu
chrono
Skúsený užívateľ
Skúsený užívateľ

Založený: 13.11.2007
Príspevky: 808

PríspevokZaslal: So 30.07.11 12:57Odpovedať s citátomNávrat hore

Netuším, ako pri posúvaní objektu mohla dôjsť pamäť (takže tam určite robíš niečo iné, ako píšeš).

kód:
#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk
import glib

class MainWindow(gtk.Window):
   def __init__(self):
      gtk.Window.__init__(self)
      
      self.set_title('Test')
      
      vbox = gtk.VBox()
      self.add(vbox)
      
      dummy = gtk.Label()
      vbox.pack_start(dummy, True, True)

      self.label = gtk.Label()
      # na konci textu musi byt tolko medzier, aby ich sirka bola vacsia, ako je pocet bodov,
      # o ktore ten text posuvame (inak sa koniec textu nebude prekreslovat, teda ak
      # neprinutime viewport, aby sa prekresloval cely, to ale vykreslovanie spomali)
      self.label.set_markup('aaa bbb <b>ccc</b> ddd eee <big>fff</big> ggg hhh iii jjj <span color="red">kkk</span> lll mmm nnn ooo ppp qqq rrr ')
      self.label.set_alignment(0.0, 0.5)
      self.viewport = gtk.Viewport()
      self.viewport.add(self.label)
      vbox.pack_start(self.viewport, False, True)
      # cas prekreslovania v milisekundach (pri 50ms ide o 20fps)
      glib.timeout_add(50, self._position_update)

      self.connect("destroy", gtk.main_quit)
      self.set_size_request(250, 150)
      self.show_all()
      
   def _position_update(self):
      # aktualna sirka okna
      window_width = self.allocation.width
      # sirka textu
      label_width = self.label.size_request()[0]
      
      viewport_ha = self.viewport.get_hadjustment()

      if viewport_ha.value >= label_width:
         # ak sme uz viewport posunuli na koniec textu, presunieme viewport v podstate pred okno
         # tak dosiahneme, ze sa text pri opakovani zobrazi uplne vpravo (inak by skocil uplne dolava)
         viewport_ha.value = -window_width
      else:
         # ak viewport este nie je na konci textu, posunieme ho o dva body
         # tato hodnota, spolu s casovacom urcuju rychlost posunu
         # ak sa ma text posuvat rychlejsie, mozeme zmensit cas pri casovaci, to ale sposobi vyssie zatazenie CPU
         # ak tu ale bude prilis velka hodnota, text bude prilis "skakat"
         viewport_ha.value += 2

      return True

MainWindow()
gtk.main()
Zobraziť informácie o autoroviOdoslať súkromnú správu
miso128
Užívateľ
Užívateľ

Založený: 30.07.2011
Príspevky: 3

PríspevokZaslal: So 30.07.11 21:39Odpovedať s citátomNávrat hore

Vďaka za vyčerpávajúcu odpoveď!
presne tak som to riešil aj ja. Problém je v tom, že to je informačná obrazovka (fullHD) a text je oveľa väčší ako v tvojom príklade, tu je upravený príklad, ktorý po pár sekundách začne sekať (aspoň mne Intel Core2Duo 2Ghz, 2GB ram).
Preto ma zaujíma, či neexistuje efektívnejší spôsob posúvania, napríklad spraviť s widgetu Label po parsovaní HTML nejaký obrázok.....alebo iný spôsob.....

vďaka za tvoj čas....


(doplnil som zmenu veľkosti písma, oznacene komentarom #DOPLNENÉ!!!!!!!!!!!!!!!!!!!!)
kód:
#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import pango
import gtk
import glib

class MainWindow(gtk.Window):
   def __init__(self):
      gtk.Window.__init__(self)
       
      self.set_title('Test')
       
      vbox = gtk.VBox()
      self.add(vbox)
       
      dummy = gtk.Label()
      vbox.pack_start(dummy, True, True)

      self.label = gtk.Label()
      # na konci textu musi byt tolko medzier, aby ich sirka bola vacsia, ako je pocet bodov,
      # o ktore ten text posuvame (inak sa koniec textu nebude prekreslovat, teda ak
      # neprinutime viewport, aby sa prekresloval cely, to ale vykreslovanie spomali)
      self.label.set_markup('aaa bbb <b>ccc</b> ddd eee <big>fff</big> ggg hhh iii jjj <span color="red">kkk</span> lll mmm nnn ooo ppp qqq rrr aaa bbb <b>ccc</b> ddd eee <big>fff</big> ggg hhh iii jjj <span color="red">kkk</span> lll mmm nnn ooo ppp qqq rrr ')
      #DOPLNENÉ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      self.label.modify_font(pango.FontDescription("Arial 150"))
      #/DOPLNENÉ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      self.label.set_alignment(0.0, 0.5)
      self.viewport = gtk.Viewport()
      self.viewport.add(self.label)
      vbox.pack_start(self.viewport, False, True)
      # cas prekreslovania v milisekundach (pri 50ms ide o 20fps)
      glib.timeout_add(50, self._position_update)

      self.connect("destroy", gtk.main_quit)
      self.set_size_request(250, 150)
      self.show_all()
       
   def _position_update(self):
      # aktualna sirka okna
      window_width = self.allocation.width
      # sirka textu
      label_width = self.label.size_request()[0]
       
      viewport_ha = self.viewport.get_hadjustment()

      if viewport_ha.value >= label_width:
         # ak sme uz viewport posunuli na koniec textu, presunieme viewport v podstate pred okno
         # tak dosiahneme, ze sa text pri opakovani zobrazi uplne vpravo (inak by skocil uplne dolava)
         viewport_ha.value = -window_width
      else:
         # ak viewport este nie je na konci textu, posunieme ho o dva body
         # tato hodnota, spolu s casovacom urcuju rychlost posunu
         # ak sa ma text posuvat rychlejsie, mozeme zmensit cas pri casovaci, to ale sposobi vyssie zatazenie CPU
         # ak tu ale bude prilis velka hodnota, text bude prilis "skakat"
        #ZMENENÉ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         viewport_ha.value += 5
        #/ZMENENÉ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

      return True

MainWindow()
gtk.main()
Zobraziť informácie o autoroviOdoslať súkromnú správu
chrono
Skúsený užívateľ
Skúsený užívateľ

Založený: 13.11.2007
Príspevky: 808

PríspevokZaslal: So 30.07.11 23:21Odpovedať s citátomNávrat hore

Zväčšil som to okno na šírku 5000 bodov a výšku 400 bodov a funguje mi to úplne normálne (aj na oveľa slabšom počítači, ako máš ty). Ak ti to teda naozaj nefunguje, možno máš staré knižnice Gtk+, Cairo...

V takom prípade ti asi nebude fungovať ani priamo Cairo, takže asi by si mohol vyskúšať Qt4 a rendrovanie pomocou OpenGL Prípadne by si mohol vyskúšať WebKit (bud nejaký prehliadač, alebo GtkWebKit, prípadne QtWebKit) a potom by si ro celé mohol robiť v javascripte.
Zobraziť informácie o autoroviOdoslať súkromnú správu
miso128
Užívateľ
Užívateľ

Založený: 30.07.2011
Príspevky: 3

PríspevokZaslal: Ne 31.07.11 9:41Odpovedať s citátomNávrat hore

Vďaka!
Zobraziť informácie o autoroviOdoslať súkromnú správu
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
Nemôžete pridávať nové témy do tohto fóra.
Nemôžete odpovedať na témy v tomto fóre.
Nemôžete upravovať svoje príspevky v tomto fóre.
Nemôžete mazať svoje príspevky v tomto fóre.
Nemôžete hlasovať v tomto fóre.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF

SEO - optimalizácia pre vyhľadávače

Freebsd