omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Transparent label text

    Pythonista
    3
    6
    2660
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • rb
      rb last edited by

      Hi there
      Simple question but I can’t seem to get this working.
      When a ui.SegmentedControl is selected the background goes black and the text transparent. How can I replicate this transparent text on a solid black background with a ui.label text?
      Tried setting text_color (0,0,0,0) and background_color (0,0,0,1) to no avail.

      mikael 2 Replies Last reply Reply Quote 0
      • mikael
        mikael @rb last edited by

        @rb, sorry for being slow, but what is the effective difference between transparent and black text on black background?

        1 Reply Last reply Reply Quote 0
        • rb
          rb last edited by

          no it’s more of a cut out text that reveals an underlying image/bg effect

          1 Reply Last reply Reply Quote 0
          • JonB
            JonB last edited by

            shouldnt it be tint_color, not text_color?

            1 Reply Last reply Reply Quote 0
            • mikael
              mikael @rb last edited by mikael

              @rb, here’s a quick custom label class which does what you want, I think.

              import ui
              
              class SeeThroughLabel(ui.View):
                
                def __init__(self, text, **kwargs):
                  super().__init__(**kwargs)
                  self.draw_background_color=self.background_color
                  self.background_color='transparent'
                  self.text = text
                  if not hasattr(self, 'font'):
                    self.font = ('<system>', 12)
                  if not hasattr(self, 'alignment'):
                    self.alignment = ui.ALIGN_CENTER
                  if not hasattr(self, 'line_break_mode'):
                    self.line_break_mode = ui.LB_WORD_WRAP
                  if not hasattr(self, 'max_width'):
                    self.max_width = 0
                  self.size_to_fit()
                  
                def size_to_fit(self):
                  fit_to_size = ui.measure_string(
                    self.text,
                    max_width=self.max_width, 
                    font=self.font, 
                    alignment=self.alignment, 
                    line_break_mode=self.line_break_mode)
                  self.bounds = (0, 0) + tuple(fit_to_size)
                  self.bounds = self.bounds.inset(-8, -8)
                  
                def draw(self):
                  ui.set_color(self.draw_background_color)
                  ui.fill_rect(*self.bounds)
                  ui.set_blend_mode(ui.BLEND_CLEAR)
                  ui.draw_string(self.text,   
                    rect=self.bounds.inset(8, 8),
                    font=self.font, color='black', 
                    alignment=self.alignment, 
                    line_break_mode=self.line_break_mode)
              
              if __name__ == '__main__':
                v = ui.View()
                v.background_color = 'red'
              
                tl = SeeThroughLabel(
                  text='Test',
                  background_color='black',
                  font=('Chalkduster', 36))
                
                tl.center = v.bounds.center()
                tl.flex = 'RLTB'
                
                v.add_subview(tl)
                v.present()
              
              1 Reply Last reply Reply Quote 0
              • mikael
                mikael last edited by

                For future reference: I also looked into setting an ObjC mask view, but UIKit does not have any nice built-in method for inverting the alpha channel of the mask, so that would have ended up having as much code as the above solution.

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post
                Powered by NodeBB Forums | Contributors