Topic: [RISOLTO] Gtk+3 Testo Scorrevole  (Letto 2252 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline rew91

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
[RISOLTO] Gtk+3 Testo Scorrevole
« il: Marzo 09, 2015, 18:20 »
ciao a tutti, come da titolo avrei bisogno di creare un testo scorrevole come questo per intenderci:
"Testo Scorrevole"ho fatto qualche ricerca ma non ho trovato praticamente niente a riguardo

Di seguito una bozza della mia finestra
[codice]
#!/usr/bin/env python

from gi.repository import Gtk

class MainWindow(Gtk.Window):
   
   def nb_pro(self, data):
      vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
      vbox.pack_start(Gtk.Label(data), False, True, 0)
      return vbox
   
   def __init__(self):
      Gtk.Window.__init__(self, title="MainWindow")
      
      self.set_position(Gtk.WindowPosition.CENTER)
      self.set_default_size(800, 600)
      
      vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
      self.add(vbox)
      
      header_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
      
      header_grid = Gtk.Grid()
      
      # Header bar
      headerbar = Gtk.HeaderBar()
      headerbar.set_show_close_button(True)
      headerbar.add(header_box)
      self.set_titlebar(headerbar)
      
      # Search entry header bar
      searchentry = Gtk.SearchEntry()
      headerbar.pack_end(searchentry)
      
      # Button PLAY header bar
      image_play = Gtk.Image()
      image_play.set_from_stock(Gtk.STOCK_MEDIA_PLAY, Gtk.IconSize.LARGE_TOOLBAR)
      button_play = Gtk.Button()
      button_play.set_image(image_play)
      header_box.pack_start(button_play, False, False, 0)
      
      #Button PAUSE header bar
      image_pause = Gtk.Image()
      image_pause.set_from_stock(Gtk.STOCK_MEDIA_PAUSE, Gtk.IconSize.SMALL_TOOLBAR)
      button_pause = Gtk.Button()
      button_pause.set_image(image_pause)
      header_box.pack_start(button_pause, False, False, 0)
      
      # Button STOP header bar
      image_stop = Gtk.Image()
      image_stop.set_from_stock(Gtk.STOCK_MEDIA_STOP, Gtk.IconSize.SMALL_TOOLBAR)
      button_stop = Gtk.Button()
      button_stop.set_image(image_stop)
      header_box.pack_start(button_stop, False, False, 0)
      
      # Scale volume header bar
      adjustment = Gtk.Adjustment(0, 0, 100, 1, 10, 0)
      volume_scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adjustment)
      volume_scale.set_draw_value(False)
      volume_scale.set_hexpand(True)
      volume_scale.set_size_request(80, -1)
      header_box.pack_start(volume_scale, False, True, 10)
      
      # Label current music title
      # TESTO SCORREVOLE
      self.label_music = Gtk.Label("current music on...")
      self.label_music.set_width_chars(10)
      header_grid.attach(self.label_music, 0, 0, 2, 1)
      
      # Scale video header bar
      adjustment = Gtk.Adjustment(0, 0, 100, 1, 1, 0)
      video_scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adjustment)
      video_scale.set_value_pos(Gtk.PositionType.RIGHT)
      video_scale.set_size_request(300, -1)
      header_grid.attach(video_scale, 0, 1, 2, 1)
      headerbar.set_custom_title(header_grid)
      
      # Notebook tabs
      nb = Gtk.Notebook()
      nb.set_tab_pos(Gtk.PositionType.TOP)
      vbox.pack_start(nb, True, True, 0)
      
      for i in ["Home", "Player", "Download"]:
         nb.append_page(self.nb_pro(i), Gtk.Label(i))
      
win = MainWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
[/codice]

Consigli e suggerimenti sono ben accetti
« Ultima modifica: Marzo 12, 2015, 07:06 da rew91 »

Offline rew91

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re: Gtk+3 Testo Scorrevole
« Risposta #1 il: Marzo 12, 2015, 07:00 »
A quanto pare gtk non supporta il testo scorrevole, non sono riuscito a farlo neanche con i css quindi ho fatto qualcosa di artigianale.
Volevo usare Viewport spostando tutto con Adjustment ma non mi spostava niente

Posto qui il codice per creare l'effetto in un label, anche se l'ho scritto al volo e andrebbe migliorato:
USO: MarqueeLabel(Gtk.Label, testo)
[codice]
class MarqueeLabel:
   
   def __init__(self, label, text):
      self.label = label
      self.original_text = text
      self.text = text
      self.len = len(text)
      ms = 115
      self.o_time = 1000 / ms
      self.time = self.o_time
      self.count = 0
      GLib.timeout_add(ms, self.marquee)
      
   def marquee(self):
      max_chars = 60
      last_val = self.count + max_chars
      white_chars = " " * (max_chars)
      
      # Ferma tutto se il testo rientra nello spazio
      if self.len <= max_chars:
         self.label.set_text(self.text)
         return False
      
      # Inserisce spazi bianchi all'inizio del testo
      # per il "fade-in"
      if (self.count == 0):
         self.text = white_chars + self.original_text
         print "first"
      
      _len = len(self.text[self.count:-1])
      
      # Toglie spazi bianchi all'inizio del testo
      # e li inserisce alla fine se sono state scritte le
      # ultime 60 (max_chars) lettere per il "fade-out"
      if (_len == max_chars) and ( not (self.text[-max_chars:] == white_chars) ):
         self.text = self.original_text + white_chars
         self.count -= max_chars
         last_val = self.count + max_chars
         print "sec"
      
      # Continua a scrivere spazi bianchi finche'
      # self.time (tempo tra un testo e l'altro) e'
      # uguale a 0
      if (self.count+1) > (self.len):
         last_val = None
         self.time -= 1
         if self.time == 0:
            self.time = self.o_time
            self.count = 0
            return True
         print "ter"
      
      try:
         text = (self.text[self.count:last_val])
         print text, len(text)
         self.label.set_text(text)
         self.count += 1
      except:
         self.label.set_text("")
      
      return True
[/codice]



Esempio:
[codice]
#!/usr/bin/env python

from gi.repository import Gtk, Gdk, GLib

class MarqueeLabel:
   
   def __init__(self, label, text):
      self.label = label
      self.original_text = text
      self.text = text
      self.len = len(text)
      ms = 115
      self.o_time = 1000 / ms
      self.time = self.o_time
      self.count = 0
      GLib.timeout_add(ms, self.marquee)
      
   def marquee(self):
      max_chars = 60
      last_val = self.count + max_chars
      white_chars = " " * (max_chars)
      
      # Ferma tutto se il testo rientra nello spazio
      if self.len <= max_chars:
         self.label.set_text(self.text)
         return False
      
      # Inserisce spazi bianchi all'inizio del testo
      # per il "fade-in"
      if (self.count == 0):
         self.text = white_chars + self.original_text
         print "first"
      
      _len = len(self.text[self.count:-1])
      
      # Toglie spazi bianchi all'inizio del testo
      # e li inserisce alla fine se sono state scritte le
      # ultime 60 (max_chars) lettere per il "fade-out"
      if (_len == max_chars) and ( not (self.text[-max_chars:] == white_chars) ):
         self.text = self.original_text + white_chars
         self.count -= max_chars
         last_val = self.count + max_chars
         print "sec"
      
      # Continua a scrivere spazi bianchi finche'
      # self.time (tempo tra un testo e l'altro) e'
      # uguale a 0
      if (self.count+1) > (self.len):
         last_val = None
         self.time -= 1
         if self.time == 0:
            self.time = self.o_time
            self.count = 0
            return True
         print "ter"
      
      try:
         text = (self.text[self.count:last_val])
         print text, len(text)
         self.label.set_text(text)
         self.count += 1
      except:
         self.label.set_text("")
      
      return True

class MainWindow(Gtk.Window):
   
   def nb_pro(self, data):
      vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
      vbox.pack_start(Gtk.Label(data), False, True, 0)
      return vbox
   
   def __init__(self):
      Gtk.Window.__init__(self, title="YoutubeDL")
      
      self.set_position(Gtk.WindowPosition.CENTER)
      self.set_default_size(800, 600)
      #self.maximize()
      
      vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
      self.add(vbox)
      
      header_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
      
      header_grid = Gtk.Grid()
      
      # Header bar
      headerbar = Gtk.HeaderBar()
      headerbar.set_show_close_button(True)
      headerbar.add(header_box)
      self.set_titlebar(headerbar)
      
      # Search entry header bar
      searchentry = Gtk.SearchEntry()
      headerbar.pack_end(searchentry)
      
      # Button PLAY header
      image_play = Gtk.Image()
      image_play.set_from_stock(Gtk.STOCK_MEDIA_PLAY, Gtk.IconSize.LARGE_TOOLBAR)
      button_play = Gtk.Button()
      button_play.set_image(image_play)
      header_box.pack_start(button_play, False, False, 0)
      
      #Button PAUSE header
      image_pause = Gtk.Image()
      image_pause.set_from_stock(Gtk.STOCK_MEDIA_PAUSE, Gtk.IconSize.SMALL_TOOLBAR)
      button_pause = Gtk.Button()
      button_pause.set_image(image_pause)
      header_box.pack_start(button_pause, False, False, 0)
      
      # Button STOP header
      image_stop = Gtk.Image()
      image_stop.set_from_stock(Gtk.STOCK_MEDIA_STOP, Gtk.IconSize.SMALL_TOOLBAR)
      button_stop = Gtk.Button()
      button_stop.set_image(image_stop)
      header_box.pack_start(button_stop, False, False, 0)
      
      # Scale volume header
      adjustment = Gtk.Adjustment(0, 0, 100, 1, 10, 0)
      volume_scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adjustment)
      volume_scale.set_draw_value(False)
      volume_scale.set_hexpand(True)
      volume_scale.set_size_request(80, -1)
      header_box.pack_start(volume_scale, False, True, 10)
      
      # Label current music title
      # TESTO SCORREVOLE
      label_music = Gtk.Label("Prova")
      label_music.set_width_chars(10)
      label_music.set_name('LabelMusic')
      header_grid.attach(label_music, 0, 0, 2, 1)
      header_grid.set_name('Grid')
      header_grid.set_row_homogeneous(True)
      
      MarqueeLabel(label_music, ""Nunc dapibus accumsan metus, commodo placerat urna blandit non. Nullam turpis justo, dictum quis dignissim non, vehicula vel lorem.")
      
      # Scale video header
      adjustment = Gtk.Adjustment(0, 0, 100, 1, 1, 0)
      video_scale = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, adjustment=adjustment)
      video_scale.set_value_pos(Gtk.PositionType.RIGHT)
      video_scale.set_size_request(380, -1)
      header_grid.attach(video_scale, 0, 1, 2, 1)
      #header_box.pack_start(header_grid, True, True, 20)
      headerbar.set_custom_title(header_grid)
      
      # Notebook tabs
      nb = Gtk.Notebook()
      nb.set_tab_pos(Gtk.PositionType.TOP)
      vbox.pack_start(nb, True, True, 0)
      
      for i in ["Home", "Player", "Download"]:
         nb.append_page(self.nb_pro(i), Gtk.Label(i))
      
      style = Gtk.CssProvider()
      
      css = """
         #Grid {
            background-image: linear-gradient(to bottom, #f0f0f0 50%, #d6d6d6 100%);
            border: 1px solid #d6d6d6;
            box-shadow: 0px 2px 0px #d6d6d6;
         }
      """
      
      style.load_from_data(css)
      
      Gtk.StyleContext.add_provider_for_screen(
         Gdk.Screen.get_default(),
         style,
         Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
      )
      
win = MainWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
#print win.get_size()
Gtk.main()
[/codice]
« Ultima modifica: Marzo 12, 2015, 07:07 da rew91 »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: [RISOLTO] Gtk+3 Testo Scorrevole
« Risposta #2 il: Marzo 12, 2015, 16:36 »
Solo per completezza... ti sarai accorto che non hai ricevuto uno straccio di risposta.
Se apri una discussione con un centinaio di linee di codice, la probabilita' che qualcuno abbia voglia di leggerle e' piuttosto bassa.

Offline rew91

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re: [RISOLTO] Gtk+3 Testo Scorrevole
« Risposta #3 il: Marzo 12, 2015, 22:58 »
Hai ragione ma esistono anche i commenti nel codice, alla fine sono tre pulsanti e 3 tabs non mi sembra difficile per chi conosce gtk ;)
Poi nel primo post il codice serve a poco e niente leggerlo, è solo la bozza della mia finestra. Nel secondo post il primo codice è la creazione di ciò che mi serviva e se può servire a qualcun'altro, anche se non è il massimo, ben venga credo; il secondo codice sarebbe solo da incollare e avviare con python per vedere l'effetto tutto qua.