Ursina, how to change font in dropdownbutton

Question:

I wish to change font or width in dropdownbutton in ursina, any help? cheer.

My simple dropdownbutton is the following

from ursina import *                    # Import the ursina engine
from ursina.prefabs.dropdown_menu import DropdownMenu, DropdownMenuButton

app = Ursina()                          # Initialise your Ursina app

def val_but(txt):
    print(txt)

DropdownMenu(text='File', buttons=(
    DropdownMenuButton('New', on_click = val_but('New')),
    DropdownMenuButton('Open'),
    DropdownMenu('Reopen Project', buttons=(
        DropdownMenuButton('Project 1'),
        DropdownMenuButton('Project 2'),
        )),
    DropdownMenuButton('Save'),
    DropdownMenu('Options', buttons=(
        DropdownMenuButton('Option a'),
        DropdownMenuButton('Option b'),
        )),
    DropdownMenuButton('Exit'),
    ), scale=(.2,.05), text_origin=(0,0), position=(-.58,.37))

app.run()                               # Run the app

I found how to change scale, text_origin and position as You can see in the last row, but still looking for change font and width of the inside text of dropdownbutton

Asked By: EMILIO

||

Answers:

I found to myself a way to change the font and wish to share it, I feel that there is a more efficient way but anyway:

Step 1: copy the font file in the current ursina directory.

Step 2: use text_entity.font attribute.

Here a working example:

from ursina import *                    # Import the ursina engine
from ursina.prefabs.dropdown_menu import DropdownMenu, DropdownMenuButton

app = Ursina()                          # Initialise your Ursina app

def val_but(txt):
    print(txt)


class DropdownMenuButton(Button):
    def __init__(self, text='', **kwargs):
        super().__init__(
            scale=(.3,.025),
            origin=(-.5, .5),
            color=color.azure,
            pressed_scale=1,
            text=text,
            **kwargs
            )
        print(str(self.text_entity.width))
        self.text_entity.scale_y=1.4
        self.text_entity.scale_x=.25
        self.text_entity.font='AbyssinicaSIL-Regular.ttf'
        print(str(self.text_entity.width))
        self.on_click = self.test_but

    def test_but(self):
        print(self.text)


class DropdownMenu(DropdownMenuButton):

    def __init__(self, text='', buttons=list(), **kwargs):
        super().__init__(text=text)
        self.position = window.top_left
        self.buttons = buttons
        for i, b in enumerate(self.buttons):
            b.world_parent = self
            b.original_scale = b.scale
            b.x = 0
            b.y = -i-1 *.98
            b.enabled = False

            if isinstance(b, DropdownMenu):
                for e in b.buttons:
                    e.x = 1
                    e.y += 1

        self.arrow_symbol = Text(world_parent=self, text='>', origin=(.5,.5), position=(.95, 0), color=color.gray)
        for key, value in kwargs.items():
            setattr(self, key, value)

    def open(self):
        for i, b in enumerate(self.buttons):
            invoke(setattr, self.buttons[i], 'enabled', True, delay=(i*.02))

    def close(self):
        for i, b in enumerate(reversed(self.buttons)):
            b.enabled = False

    def on_mouse_enter(self):
        super().on_mouse_enter()
        self.open()

    def input(self, key):
        if key == 'left mouse down' and mouse.hovered_entity and mouse.hovered_entity.has_ancestor(self):
            self.close()

    def update(self):
        if self.hovered or mouse.hovered_entity and mouse.hovered_entity.has_ancestor(self):
            return

        self.close()

window.title = 'My Game'                # The window title
window.icon = 'tigre.ico'
window.borderless = False               # Show a border
window.fullscreen = False               # Do not go Fullscreen
# window.exit_button.visible = False      # Do not show the in-game red X that loses the window
window.fps_counter.enabled = True       # Show the FPS (Frames per second) counter

DropdownMenu(text='File', buttons=(
    DropdownMenuButton('New'),
    DropdownMenuButton('Open'),
    DropdownMenu('Reopen Project', buttons=(
        DropdownMenuButton('Project 1'),
        DropdownMenuButton('Project 2'),
        )),
    DropdownMenuButton('Save'),
    DropdownMenu('Options', buttons=(
        DropdownMenuButton('Option a'),
        DropdownMenuButton('Option b'),
        )),
    DropdownMenuButton('Exit'),
    ), scale=(.4,.05), text_origin=(0,0), position=(-.58,.37),
    color=color.pink)

def input(key):
    print(key)

app.run()                               # Run the app

Thanks to Pokepetter for suggestion.

Answered By: EMILIO
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.