| Autor | Správa |
miso128
 Užívateľ
 Založený: 30.07.2011 Príspevky: 3
 |
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ý! |
| |
  |
 |
chrono
 Skúsený užívateľ
 Založený: 13.11.2007 Príspevky: 808
 | Zaslal: So 30.07.11 12:57 |   |
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()
|
|
| |
  |
 |
miso128
 Užívateľ
 Založený: 30.07.2011 Príspevky: 3
 | Zaslal: So 30.07.11 21:39 |   |
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() |
|
| |
  |
 |
chrono
 Skúsený užívateľ
 Založený: 13.11.2007 Príspevky: 808
 | Zaslal: So 30.07.11 23:21 |   |
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. |
| |
  |
 |
miso128
 Užívateľ
 Založený: 30.07.2011 Príspevky: 3
 |
|
  |
 |
|
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.
|
|