October 21, 2024
Chicago 12, Melborne City, USA
python

How to fix this pygame menu UI?


This is setting up the class to show the main menu

class CreatePlayer:
    def __init__(self, screen, width, height):
        self.screen = screen
        self.width = width
        self.height = height
        self.country_name=""
        self.flag_color_1 = self.random_color()
        self.flag_color_2 = self.random_color()
        self.symbol_color = self.random_color()
        self.pattern = 'Stripes'
        self.shape="Circle"
        self.shape_size = 50
        self.shape_position = (self.width // 2, self.height // 2)
        self.makes = []
        self.models = []
        self.selected_make = None
        self.selected_model = None
        self.car_data = None
        self.play = False
        self.create_main()

The Error pygame_menu.widgets.widget.frame._FrameSizeException keeps occuring no matter what fixes are inplemented

    def create_main(self):
        self.menu = pygame_menu.Menu('Create Your Player', self.width, self.height, theme=pygame_menu.themes.THEME_DARK)
        self.inputWidth, self.inputHeight = 240, 224
        # Flag creation section
        flag_frame = self.menu.add.frame_v(width=self.inputWidth, height=self.inputHeight)
        label = self.menu.add.label('Create Your Flag')
        label.set_float(True)  # Let the widget float
        flag_frame.pack(self.menu.add.text_input("Country Name: ", onchange=self.set_country_name, input_underline_len=1, maxchar=15))
        
        color_frame = flag_frame.pack(self.menu.add.frame_h(width=self.inputWidth, height=self.inputHeight))
        color_frame.pack(self.menu.add.color_input("Flag 1", default=self.flag_color_1, onchange=self.set_flag_color_1, color_type="rgb", input_underline_len=1))
        color_frame.pack(self.menu.add.color_input("Flag 2", default=self.flag_color_2, onchange=self.set_flag_color_2, color_type="rgb", input_underline_len=1))
        color_frame.pack(self.menu.add.color_input("Symbol", default=self.symbol_color, onchange=self.set_symbol_color, color_type="rgb", input_underline_len=1))

        controls_frame = flag_frame.pack(self.menu.add.frame_v(width=self.inputWidth, height=self.inputHeight))
        controls_frame.pack(self.menu.add.toggle_switch('Pattern', ['Stripes', 'Solid', 'Checker'], onchange=self.set_pattern))
        controls_frame.pack(self.menu.add.toggle_switch('Shape', ['Circle', 'Square', 'Star'], onchange=self.set_shape))
        controls_frame.pack(self.menu.add.range_slider('Size', default=self.shape_size, range_values=(10, 100), onchange=self.set_shape_size))
        controls_frame.pack(self.menu.add.range_slider('X', default=self.shape_position[0], range_values=(0, self.width), onchange=self.set_shape_position_x))
        controls_frame.pack(self.menu.add.range_slider('Y', default=self.shape_position[1], range_values=(0, self.height), onchange=self.set_shape_position_y))

        # Car creation section
        car_frame = self.menu.add.frame_v(width=self.inputWidth, height=self.inputHeight)
        car_frame.pack(self.menu.add.label('Create Your Car', font_size=24))
        car_frame.pack(self.menu.add.label(f'User Number: {self.userNumber}'))
        car_frame.pack(self.menu.add.image(r"ImageFile/carPortfolio_Image.png", scale=(0.5, 0.5)))

        car_color_frame = car_frame.pack(self.menu.add.frame_h(width=self.inputWidth, height=self.inputHeight))
        car_color_frame.pack(self.menu.add.color_input("Car Color", default=self.random_color(), input_underline_len=1))
        car_color_frame.pack(self.menu.add.color_input("Interior", default=self.random_color(), input_underline_len=1))

        self.make_modelsList()
        car_frame.pack(self.menu.add.selector("Make: ", items=self.makes, onchange=self.set_make))
        self.model_selector = car_frame.pack(self.menu.add.selector("Model: ", items=self.models, onchange=self.set_model))
        car_frame.pack(self.menu.add.text_input("Year: ", input_underline_len=4))  # Fixed width for Year input

        info_frame = car_frame.pack(self.menu.add.frame_v(width=self.inputWidth, height=self.inputHeight))
        info_frame.pack(self.menu.add.label('Car Information', font_size=20))
        self.transmission_label = info_frame.pack(self.menu.add.label('Transmission: '))
        self.engine_label = info_frame.pack(self.menu.add.label('Engine Size: '))
        self.mass_label = info_frame.pack(self.menu.add.label('Total Mass: '))
        self.size_label = info_frame.pack(self.menu.add.label('Total Size: '))
        self.speed_label = info_frame.pack(self.menu.add.label('Maximum Speed: '))
        self.drag_label = info_frame.pack(self.menu.add.label('Total Drag: '))

        self.menu.add.button('Play', self.play_game)

This seems to work just fine, here just incase more is needed

    def random_color(self):
        return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

    def set_country_name(self, value):
        self.country_name = value

    def set_flag_color_1(self, color):
        self.flag_color_1 = color
        self.draw_flag()

    def set_flag_color_2(self, color):
        self.flag_color_2 = color
        self.draw_flag()

    def set_symbol_color(self, color):
        self.symbol_color = color
        self.draw_flag()

    def set_pattern(self, pattern):
        self.pattern = pattern
        self.draw_flag()

    def set_shape(self, shape):
        self.shape = shape
        self.draw_flag()

    def set_shape_size(self, size):
        self.shape_size = int(size)
        self.draw_flag()

    def set_shape_position_x(self, x):
        self.shape_position = (int(x), self.shape_position[1])
        self.draw_flag()

    def set_shape_position_y(self, y):
        self.shape_position = (self.shape_position[0], int(y))
        self.draw_flag()

    def draw_shape(self, surface):
        if self.shape == 'Circle':
            pygame.draw.circle(surface, self.symbol_color, self.shape_position, self.shape_size)
        elif self.shape == 'Square':
            rect = pygame.Rect(0, 0, self.shape_size * 2, self.shape_size * 2)
            rect.center = self.shape_position
            pygame.draw.rect(surface, self.symbol_color, rect)
        elif self.shape == 'Star':
            self.draw_star(surface, self.shape_position, self.shape_size, 5, self.symbol_color)

    def draw_star(self, surface, position, size, points, color):
        x, y = position
        point_list = []
        angle_step = 360 / points
        for i in range(points * 2):
            angle = i * angle_step / 2
            radius = size if i % 2 == 0 else size // 2
            radian_angle = math.radians(angle)
            point_x = x + int(math.cos(radian_angle) * radius)
            point_y = y + int(math.sin(radian_angle) * radius)
            point_list.append((point_x, point_y))
        pygame.draw.polygon(surface, color, point_list)

    def draw_flag(self):
        flag_surface = pygame.Surface((self.width // 2, self.height // 2))
        flag_rect = flag_surface.get_rect()

        if self.pattern == 'Stripes':
            pygame.draw.rect(flag_surface, self.flag_color_1, flag_rect)
            pygame.draw.rect(flag_surface, self.flag_color_2, pygame.Rect(0, flag_rect.height // 2, flag_rect.width, flag_rect.height // 2))
        elif self.pattern == 'Solid':
            pygame.draw.rect(flag_surface, self.flag_color_1, flag_rect)
        elif self.pattern == 'Checker':
            checker_size = flag_rect.width // 2
            pygame.draw.rect(flag_surface, self.flag_color_1, pygame.Rect(0, 0, checker_size, checker_size))
            pygame.draw.rect(flag_surface, self.flag_color_2, pygame.Rect(checker_size, 0, checker_size, checker_size))
            pygame.draw.rect(flag_surface, self.flag_color_2, pygame.Rect(0, checker_size, checker_size, checker_size))
            pygame.draw.rect(flag_surface, self.flag_color_1, pygame.Rect(checker_size, checker_size, checker_size, checker_size))

        self.draw_shape(flag_surface)
        
        self.screen.blit(flag_surface, (self.width // 4, self.height // 4))
        pygame.display.flip()

    def make_modelsList(self):
        data = pd.read_csv('dataFiles/car_db_metric.csv', header=0, usecols=['make', 'model'])
        self.makes = data['make'].unique().tolist()
        self.models = data['model'].unique().tolist()

    def set_make(self, make):
        self.selected_make = make
        self.update_model_list(make)

    def set_model(self, model):
        self.selected_model = model
        self.update_car_info()

    def update_model_list(self, make):
        data = pd.read_csv('dataFiles/car_db_metric.csv', header=0, usecols=['make', 'model'])
        filtered_data = data[data['make'] == make]
        self.models = filtered_data['model'].unique().tolist()
        self.model_selector.update_items(self.models)

    def update_car_info(self):
        # This method should be implemented to update the car information labels
        # based on the selected make and model
        pass

    def play_game(self):
        self.play = True

    def run(self):
        self.draw_flag()
        self.menu.mainloop(self.screen)
        return self.play, self.country_name, self.flag_color_1, self.flag_color_2, self.symbol_color, self.pattern, self.shape, self.shape_size, self.shape_position, self.selected_make, self.selected_model

Changed the scalling for the frames (16 x 16 minmun) and set the label as a flaot, input_underline_len which was an consitent error and changed frame orintation.



You need to sign in to view this answers

Leave feedback about this

  • Quality
  • Price
  • Service

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video