[ Príspevkov: 5 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.07.11
Prihlásený: 30.07.11
Príspevky: 3
Témy: 1 | 1
NapísalOffline : 30.07.2011 9:19 | GTK bežiaci text (python)

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ý!


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0 | 0
NapísalOffline : 30.07.2011 12:57 | GTK bežiaci text (python)

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


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.07.11
Prihlásený: 30.07.11
Príspevky: 3
Témy: 1 | 1
Napísal autor témyOffline : 30.07.2011 21:39 | GTK bežiaci text (python)

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


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 13.11.07
Prihlásený: 20.08.16
Príspevky: 1702
Témy: 0 | 0
NapísalOffline : 30.07.2011 23:21 | GTK bežiaci text (python)

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.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.07.11
Prihlásený: 30.07.11
Príspevky: 3
Témy: 1 | 1
Napísal autor témyOffline : 31.07.2011 9:41 | GTK bežiaci text (python)

Vďaka!


 [ Príspevkov: 5 ] 


GTK bežiaci text (python)



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Python script bežiaci non stop

v Webhosting a servery

3

514

16.12.2017 11:30

bebebrumik

V tomto fóre nie sú ďalšie neprečítané témy.

Bežiaci text vs hodiny

v JavaScript, VBScript, Ajax

0

1021

19.02.2009 0:20

dafo

V tomto fóre nie sú ďalšie neprečítané témy.

Login problem - GTK

v Operačné systémy Unix a Linux

6

614

14.03.2008 16:45

socket

V tomto fóre nie sú ďalšie neprečítané témy.

PHP-GTK - ulozenie exe

v PHP, ASP

4

627

06.05.2010 15:41

Blackshadow

V tomto fóre nie sú ďalšie neprečítané témy.

PHP - ako na klasicke desktop aplikacie (GTK)

v PHP, ASP

4

4397

03.09.2010 0:14

el_fuego333

V tomto fóre nie sú ďalšie neprečítané témy.

Čas bežiaci aktuálny bez refreshu

v JavaScript, VBScript, Ajax

7

1013

22.12.2008 18:04

Tominator

V tomto fóre nie sú ďalšie neprečítané témy.

Ktory beziaci proces je dial-up connection?

v Operačné systémy Microsoft

1

330

17.01.2008 8:54

Intelman

V tomto fóre nie sú ďalšie neprečítané témy.

moj problem je stale beziaci ventilator na notasi

v Intel - Integrated Electronics

7

2378

26.03.2008 14:27

wave

V tomto fóre nie sú ďalšie neprečítané témy.

Python

v Perl, Python, Ruby, CGI

12

891

02.07.2021 8:41

void

Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie.

python

v Perl, Python, Ruby, CGI

1

742

19.12.2011 23:09

Ďuri

V tomto fóre nie sú ďalšie neprečítané témy.

Python-funkcia

v Perl, Python, Ruby, CGI

12

700

12.11.2014 0:21

Misosvk

V tomto fóre nie sú ďalšie neprečítané témy.

Vyvojar Python

v Ponuka práce

0

630

31.05.2012 20:47

webwrx

V tomto fóre nie sú ďalšie neprečítané témy.

Python skusenosti

v Perl, Python, Ruby, CGI

19

1285

12.07.2013 23:36

phodinux

V tomto fóre nie sú ďalšie neprečítané témy.

Python zoznam

v Perl, Python, Ruby, CGI

1

684

14.06.2013 21:35

reDo

V tomto fóre nie sú ďalšie neprečítané témy.

Python, program

v Perl, Python, Ruby, CGI

6

1068

02.07.2013 19:04

reDo

V tomto fóre nie sú ďalšie neprečítané témy.

python LinearDiscriminantAnalysis

v Perl, Python, Ruby, CGI

0

464

22.08.2016 13:23

marian_r



© 2005 - 2024 PCforum, edited by JanoF