1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Нейросети и прочие ИИ

Тема в разделе "Флейм", создана пользователем GreenEyesMan, 23 дек 2022.

?

А вы бы хотели, чтобы вашу работу отдали роботу?

  1. Да.

    5 голосов
    3,8%
  2. Да, конечно!

    14 голосов
    10,8%
  3. Разумеется!

    5 голосов
    3,8%
  4. А у меня есть выбор?

    38 голосов
    29,2%
  5. Пусть он еще и гуся (кота, жену, мужа, ребенка, - нужное подчеркнуть) моего заберет?

    6 голосов
    4,6%
  6. Я бы хотел сказать "Нет", но если подумать...

    4 голосов
    3,1%
  7. Ну попробуйте, отдайте мою работу роботу, а я посмотрю.

    58 голосов
    44,6%
  1. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    @Strategus, Подобных целая нейро-куча с ии-хвостиком, лучше с ними и не связываться))
     
  2. Forgettable Nightmare Knight

    Forgettable

    Редактор Хелпер

    Регистрация:
    3 авг 2019
    Сообщения:
    10.250
    Если вы про рутрекер, то нет, для этого есть huggingface, у них уже сотни терабайт различных ллм и место резиновое.
     
    Razor1977 и Dar_Morar нравится это.
  3. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
  4. Strategus

    Strategus

    Регистрация:
    1 мар 2024
    Сообщения:
    212
    Да я вообще, уже только гуглом (тот который в режиме поисковика вызывается) пользуюсь и Duck.ai. Не надо регистрироваться, не надо платить, да и мне от них не так много надо. Но обилие рекламы меня и натолкнуло на мысль, про ушлый народец )) Конечно я попробовать хотел там разные варианты, но я даже 20 рублей не стану отдавать, за то чтобы попробовать там... Может оно мне нафиг не надо, я и так время трачу, а тут еще и деньги кому то платить )) Вот если оно мне реально надо было бы, то другое дело...
     
    Mel Shlemming и Razor1977 нравится это.
  5. Gamerun

    Gamerun

    Хелпер

    Регистрация:
    13 июн 2010
    Сообщения:
    9.354
    RGBIDraw.png
    IBM PC CGA RGBI Draw Tool (160x100x16)
    Рисовалка изображений в нестандартном CGA режиме 160x100x16 RGBI (модификация режима 80x25 с поддержкой цвета).
    Можно открывать .PIC файлы и сохранять в них же или в PNG. Цвет меняется кликом мыши на боковой панели, рисование мышкой, опции стандартной сетки (8x8) и пропорций 4:3, масштабирование до x10.
    Во вложении python-скрипт и демонстрационный IMG.PIC.
     

    Вложения:

    Razor1977 и Forgettable нравится это.
  6. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    @Gamerun, @Forgettable, Поэтапно, так как многие до сей поры не понимают, что такое нейро-))

    1. Ваш файл берем, который питонов, переименовываем в txt, в Gemini в билде вкладываем в виде печатного кода
    2. В промпт вашими же словами:
    "Во вложении *.txt python-скрипт
    IBM PC CGA RGBI Draw Tool (160x100x16)
    Рисовалка изображений в нестандартном CGA режиме 160x100x16 RGBI (модификация режима 80x25 с поддержкой цвета).
    Можно открывать .PIC файлы и сохранять в них же или в PNG. Цвет меняется кликом мыши на боковой панели, рисование мышкой, опции стандартной сетки (8x8) и пропорций 4:3, масштабирование до x10.
    Однако возникла проблема - после сохранения или загрузки файла (клавиши S и L соответственно) перестает работать прочий функционал (курсор не реагирует на стрелки, а при нажатии на другие клавиши он перемещается на несколько пикселей вправо в пределах строки, поведение повторяется и при выходе и повторном запуске). Попытки это исправить успехом не увенчались (Qwen, DeepSeek, Grok).
    Возможно, что ошибку можно было бы отловить через дебаг, но моих способностей на это не хватает. Помогите, пожалуйста."

    Gemini 3 Pro:

    Судя по предоставленному коду и описанию проблемы, основная причина заключается в потере фокуса (Focus Loss).

    Когда открывается диалоговое окно (Open/Save), фокус ввода переходит от вашего окна tkinter к системному окну проводника. После закрытия диалога фокус часто возвращается не на Canvas (холст), где должны обрабатываться нажатия клавиш, а на корневое окно, кнопку меню или последнюю активную кнопку (например, кнопку цвета).

    В предоставленном вами коде отсутствует логика обработки клавиатуры (нет методов bind для клавиш <Left>, <Right> и т.д.). Вероятно, вы либо не включили эту часть в присланный файл, либо ожидаете, что она там должна быть.

    Ниже представлено исправленное и дополненное решение:

    1. Принудительный возврат фокуса: Добавлен вызов self.canvas.focus_set() после каждого закрытия диалогового окна (askopenfilename, asksaveasfilename) и при клике мышкой по холсту. Это гарантирует, что программа будет реагировать на клавиши.

    2. Добавлен функционал клавиатуры: Так как в исходнике его не было, я реализовал курсор, управление стрелками и рисование «Пробелом» или «Enter», чтобы соответствовать вашему описанию «курсор не реагирует».

    3. Визуализация курсора: Добавлена отрисовка рамки курсора, чтобы вы видели, где находитесь
    import tkinter as tk
    from tkinter import ttk, filedialog, messagebox
    from PIL import Image, ImageTk
    import numpy as np
    # IBM PC RGBI 16-color palette
    IBM_PC_PALETTE = [
    (0x00, 0x00, 0x00), # 0: Black
    (0x00, 0x00, 0xAA), # 1: Blue
    (0x00, 0xAA, 0x00), # 2: Green
    (0x00, 0xAA, 0xAA), # 3: Cyan
    (0xAA, 0x00, 0x00), # 4: Red
    (0xAA, 0x00, 0xAA), # 5: Magenta
    (0xAA, 0x55, 0x00), # 6: Brown
    (0xAA, 0xAA, 0xAA), # 7: Light Gray
    (0x55, 0x55, 0x55), # 8: Dark Gray
    (0x55, 0x55, 0xFF), # 9: Light Blue
    (0x55, 0xFF, 0x55), # 10: Light Green
    (0x55, 0xFF, 0xFF), # 11: Light Cyan
    (0xFF, 0x55, 0x55), # 12: Light Red
    (0xFF, 0x55, 0xFF), # 13: Light Magenta
    (0xFF, 0xFF, 0x55), # 14: Yellow
    (0xFF, 0xFF, 0xFF), # 15: White
    ]
    COLOR_NAMES = ["Black", "Blue", "Green", "Cyan", "Red", "Magenta",
    "Brown", "Light Gray", "Dark Gray", "Light Blue",
    "Light Green", "Light Cyan", "Light Red", "Light Magenta",
    "Yellow", "White"]
    class RGBIDrawingTool:
    def __init__(self, root):
    self.root = root
    self.root.title("160x100x16 RGBI Drawing Tool")

    # Image data (160x100 pixels)
    self.width = 160
    self.height = 100

    # Keyboard cursor position
    self.cursor_x = 0
    self.cursor_y = 0

    # Aspect ratio correction
    self.use_4_3_aspect = False
    self.aspect_ratio = 1.0

    self.image_data = np.zeros((self.height, self.width), dtype=np.uint8)
    self.current_color = 15
    self.is_drawing = False
    self.scale = 4
    self.show_grid = False

    # Create UI
    self.create_menu()
    self.create_main_layout()

    # Initialize display
    self.update_display()
    self.update_current_color_display()
    # --- FIX: Инициализация фокуса ---
    # Устанавливаем фокус на холст сразу при запуске
    self.canvas.focus_set()

    def create_menu(self):
    menubar = tk.Menu(self.root)
    self.root.config(menu=menubar)

    file_menu = tk.Menu(menubar, tearoff=0)
    menubar.add_cascade(label="File", menu=file_menu)
    file_menu.add_command(label="New", command=self.new_image)
    file_menu.add_command(label="Open PIC...", command=self.open_pic)
    file_menu.add_command(label="Save PIC...", command=self.save_pic)
    file_menu.add_command(label="Save PNG...", command=self.save_png)
    file_menu.add_separator()
    file_menu.add_command(label="Exit", command=self.root.quit)

    view_menu = tk.Menu(menubar, tearoff=0)
    menubar.add_cascade(label="View", menu=view_menu)
    self.grid_var = tk.BooleanVar(value=False)
    view_menu.add_checkbutton(label="Show Grid", variable=self.grid_var,
    command=self.toggle_grid)

    self.aspect_var = tk.BooleanVar(value=False)
    view_menu.add_checkbutton(label="4:3 Aspect Ratio", variable=self.aspect_var,
    command=self.toggle_aspect_ratio)

    zoom_menu = tk.Menu(view_menu, tearoff=0)
    view_menu.add_cascade(label="Zoom", menu=zoom_menu)
    self.zoom_var = tk.IntVar(value=4)
    for scale in [2, 3, 4, 5, 6, 8, 10]:
    zoom_menu.add_radiobutton(label=f"{scale}x",
    variable=self.zoom_var,
    command=lambda s=scale: self.set_scale(s))

    def create_main_layout(self):
    main_paned = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL)
    main_paned.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

    left_frame = ttk.Frame(main_paned, width=700)
    main_paned.add(left_frame, weight=3)

    canvas_frame = ttk.LabelFrame(left_frame, text="Draw Window (160x100)")
    canvas_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

    self.update_canvas_size()
    self.canvas = tk.Canvas(canvas_frame,
    width=self.canvas_width,
    height=self.canvas_height,
    bg='black',
    highlightthickness=1,
    highlightbackground='gray',
    takefocus=1) # Разрешаем Canvas принимать фокус
    self.canvas.pack(padx=5, pady=5)

    # --- Bindings ---
    self.canvas.bind("<Button-1>", self.start_drawing)
    self.canvas.bind("<B1-Motion>", self.draw)
    self.canvas.bind("<ButtonRelease-1>", self.stop_drawing)

    # --- FIX: Клавиатурные привязки ---
    # Привязываем клавиши к Canvas, чтобы они работали, когда фокус на нем
    self.canvas.bind("<Left>", lambda e: self.move_cursor(-1, 0))
    self.canvas.bind("<Right>", lambda e: self.move_cursor(1, 0))
    self.canvas.bind("<Up>", lambda e: self.move_cursor(0, -1))
    self.canvas.bind("<Down>", lambda e: self.move_cursor(0, 1))
    self.canvas.bind("<space>", self.draw_pixel_at_cursor)
    self.canvas.bind("<Return>", self.draw_pixel_at_cursor)

    self.status_var = tk.StringVar()
    self.status_var.set("Position: (0, 0) | Color: 15 (White)")
    status_bar = ttk.Label(left_frame, textvariable=self.status_var,
    relief=tk.SUNKEN, anchor=tk.W)
    status_bar.pack(fill=tk.X, padx=5, pady=2)

    right_frame = ttk.Frame(main_paned, width=220)
    main_paned.add(right_frame, weight=1)

    palette_frame = ttk.LabelFrame(right_frame, text="Paint Window (Colors)")
    palette_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
    palette_frame.pack_propagate(False)

    colors_container = ttk.Frame(palette_frame)
    colors_container.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

    self.color_buttons = []
    for i in range(16):
    r, g, b = IBM_PC_PALETTE
    color_hex = f'#{r:02x}{g:02x}{b:02x}'

    btn_frame = ttk.Frame(colors_container)
    btn_frame.pack(fill=tk.X, pady=2)

    # Добавляем takefocus=0 кнопкам, чтобы они не воровали фокус при Tab
    btn = tk.Button(btn_frame, bg=color_hex, width=3, height=2,
    command=lambda c=i: self.set_color(c),
    relief=tk.RAISED, borderwidth=2,
    activebackground=color_hex,
    takefocus=0)
    btn.pack(side=tk.LEFT, padx=3)

    label = ttk.Label(btn_frame, text=f"{i:2d}: {COLOR_NAMES}",
    font=('Courier', 9), width=15, anchor=tk.W)
    label.pack(side=tk.LEFT, padx=5)

    self.color_buttons.append(btn)

    current_frame = ttk.LabelFrame(palette_frame, text="Current Color")
    current_frame.pack(padx=10, pady=10, fill=tk.X)

    self.current_color_label = tk.Label(current_frame,
    bg='#FFFFFF',
    width=20, height=3,
    relief=tk.SUNKEN, borderwidth=3)
    self.current_color_label.pack(pady=5, padx=5)

    self.color_name_var = tk.StringVar(value="White")
    color_name = ttk.Label(current_frame, textvariable=self.color_name_var,
    font=('Courier', 10, 'bold'))
    color_name.pack(pady=5)
    # --- FIX: Методы для клавиатуры ---
    def move_cursor(self, dx, dy):
    """Перемещение курсора с клавиатуры"""
    new_x = max(0, min(self.width - 1, self.cursor_x + dx))
    new_y = max(0, min(self.height - 1, self.cursor_y + dy))

    self.cursor_x = new_x
    self.cursor_y = new_y

    self.update_status()
    self.update_display() # Перерисовка для обновления положения курсора
    def draw_pixel_at_cursor(self, event=None):
    """Рисование в точке курсора (для пробела)"""
    self.image_data[self.cursor_y, self.cursor_x] = self.current_color
    self.update_display()
    self.update_status()
    def update_status(self):
    """Обновление строки статуса"""
    self.status_var.set(f"Position: ({self.cursor_x}, {self.cursor_y}) | Color: {self.current_color} ({COLOR_NAMES[self.current_color]})")
    def draw_cursor_rect(self):
    """Отрисовка рамки курсора"""
    x = self.cursor_x
    y = self.cursor_y

    if self.use_4_3_aspect:
    x1 = x * self.scale
    y1 = int(y * self.scale * 1.2)
    x2 = x1 + self.scale
    y2 = y1 + int(self.scale * 1.2)
    else:
    x1 = x * self.scale
    y1 = y * self.scale
    x2 = x1 + self.scale
    y2 = y1 + self.scale

    # Рисуем инвертированную или яркую рамку
    self.canvas.create_rectangle(x1, y1, x2, y2, outline='red', width=2, tags="cursor")
    def update_canvas_size(self):
    if self.use_4_3_aspect:
    self.canvas_width = self.width * self.scale
    self.canvas_height = int(self.height * self.scale * 1.2)
    else:
    self.canvas_width = self.width * self.scale
    self.canvas_height = self.height * self.scale

    def toggle_aspect_ratio(self):
    self.use_4_3_aspect = self.aspect_var.get()
    self.aspect_ratio = 1.2 if self.use_4_3_aspect else 1.0
    self.update_canvas_size()
    self.canvas.config(width=self.canvas_width, height=self.canvas_height)
    self.update_display()

    def set_color(self, color_index):
    self.current_color = color_index
    self.update_current_color_display()
    # --- FIX: Возвращаем фокус на холст после клика по кнопке цвета ---
    self.canvas.focus_set()

    def update_current_color_display(self):
    r, g, b = IBM_PC_PALETTE[self.current_color]
    color_hex = f'#{r:02x}{g:02x}{b:02x}'
    self.current_color_label.config(bg=color_hex)
    self.color_name_var.set(f"{self.current_color}: {COLOR_NAMES[self.current_color]}")

    for i, btn in enumerate(self.color_buttons):
    if i == self.current_color:
    btn.config(relief=tk.SUNKEN, borderwidth=3)
    else:
    btn.config(relief=tk.RAISED, borderwidth=2)

    def set_scale(self, scale):
    self.scale = scale
    self.zoom_var.set(scale)
    self.update_canvas_size()
    self.canvas.config(width=self.canvas_width, height=self.canvas_height)
    self.update_display()

    def toggle_grid(self):
    self.show_grid = self.grid_var.get()
    self.update_display()

    def get_pixel_from_canvas(self, x, y):
    if self.use_4_3_aspect:
    pixel_x = x // self.scale
    pixel_y = int(y // (self.scale * 1.2))
    else:
    pixel_x = x // self.scale
    pixel_y = y // self.scale
    return max(0, min(pixel_x, self.width - 1)), max(0, min(pixel_y, self.height - 1))

    def start_drawing(self, event):
    # --- FIX: Клик по холсту должен возвращать фокус ---
    self.canvas.focus_set()
    self.is_drawing = True
    self.draw(event)

    def draw(self, event):
    if not self.is_drawing:
    return

    pixel_x, pixel_y = self.get_pixel_from_canvas(event.x, event.y)
    self.image_data[pixel_y, pixel_x] = self.current_color

    # Обновляем координаты курсора при клике мышкой
    self.cursor_x = pixel_x
    self.cursor_y = pixel_y

    self.update_single_pixel(pixel_x, pixel_y)
    self.status_var.set(f"Position: ({pixel_x}, {pixel_y}) | Color: {self.current_color} ({COLOR_NAMES[self.current_color]})")

    def stop_drawing(self, event):
    self.is_drawing = False
    # Полная перерисовка при отпускании, чтобы восстановить сетку/курсор поверх
    self.update_display()

    def update_single_pixel(self, x, y):
    color_index = self.image_data[y, x]
    r, g, b = IBM_PC_PALETTE[color_index]
    color_hex = f'#{r:02x}{g:02x}{b:02x}'

    if self.use_4_3_aspect:
    x1 = x * self.scale
    y1 = int(y * self.scale * 1.2)
    x2 = x1 + self.scale
    y2 = y1 + int(self.scale * 1.2)
    else:
    x1 = x * self.scale
    y1 = y * self.scale
    x2 = x1 + self.scale
    y2 = y1 + self.scale

    # Удаляем старый пиксель и курсор под ним
    items = self.canvas.find_overlapping(x1+1, y1+1, x2-1, y2-1)
    for item in items:
    tags = self.canvas.gettags(item)
    if self.canvas.type(item) == 'rectangle' and "cursor" not in tags:
    self.canvas.delete(item)

    self.canvas.create_rectangle(x1, y1, x2, y2, fill=color_hex, outline='')

    def update_display(self):
    self.canvas.delete("all")

    img_array = np.zeros((self.height, self.width, 3), dtype=np.uint8)

    for y in range(self.height):
    for x in range(self.width):
    color_index = self.image_data[y, x]
    img_array[y, x] = IBM_PC_PALETTE[color_index]

    img = Image.fromarray(img_array, 'RGB')

    if self.scale > 1:
    if self.use_4_3_aspect:
    target_width = self.width * self.scale
    target_height = int(self.height * self.scale * 1.2)
    else:
    target_width = self.width * self.scale
    target_height = self.height * self.scale

    img = img.resize((target_width, target_height), Image.NEAREST)

    self.photo = ImageTk.PhotoImage(img)
    self.canvas.create_image(0, 0, anchor=tk.NW, image=self.photo)

    if self.show_grid:
    if self.use_4_3_aspect:
    grid_spacing_x = 8 * self.scale
    grid_spacing_y = int(8 * self.scale * 1.2)
    else:
    grid_spacing_x = 8 * self.scale
    grid_spacing_y = 8 * self.scale

    for x in range(0, self.width + 1, 8):
    x_pos = x * self.scale
    self.canvas.create_line(x_pos, 0, x_pos, self.canvas_height,
    fill='gray', dash=(2, 2), width=1)

    for y in range(0, self.height + 1, 8):
    if self.use_4_3_aspect:
    y_pos = int(y * self.scale * 1.2)
    else:
    y_pos = y * self.scale
    self.canvas.create_line(0, y_pos, self.canvas_width, y_pos,
    fill='gray', dash=(2, 2), width=1)

    # --- FIX: Рисуем курсор поверх всего ---
    self.draw_cursor_rect()

    def new_image(self):
    if messagebox.askyesno("New Image", "Clear current image?"):
    self.image_data = np.zeros((self.height, self.width), dtype=np.uint8)
    self.update_display()
    # --- FIX ---
    self.canvas.focus_set()

    def open_pic(self):
    filename = filedialog.askopenfilename(
    title="Open PIC file",
    filetypes=[("PIC files", "*.PIC"), ("All files", "*.*")]
    )
    # --- FIX: Важнейшая строка. Возвращаем фокус после закрытия диалога ---
    self.canvas.focus_set()

    if filename:
    try:
    with open(filename, 'rb') as f:
    data = f.read()

    if len(data) != 16000:
    messagebox.showerror("Error", f"Invalid PIC file size: {len(data)} bytes (expected 16000)")
    return

    self.image_data = np.zeros((self.height, self.width), dtype=np.uint8)

    for y in range(self.height):
    for x in range(0, self.width, 2):
    char_col = x // 2
    char_index = y * 80 + char_col
    attr_offset = char_index * 2 + 1

    if attr_offset < len(data):
    attr_byte = data[attr_offset]
    left_pixel = (attr_byte >> 4) & 0x0F
    right_pixel = attr_byte & 0x0F

    self.image_data[y, x] = left_pixel
    if x + 1 < self.width:
    self.image_data[y, x + 1] = right_pixel

    self.update_display()
    messagebox.showinfo("Success", "PIC file loaded successfully")

    except Exception as e:
    messagebox.showerror("Error", f"Failed to load PIC file:\n{str(e)}")

    # На всякий случай еще раз устанавливаем фокус после messagebox
    self.canvas.focus_set()

    def save_pic(self):
    filename = filedialog.asksaveasfilename(
    title="Save PIC file",
    defaultextension=".PIC",
    filetypes=[("PIC files", "*.PIC"), ("All files", "*.*")]
    )
    # --- FIX: Возврат фокуса ---
    self.canvas.focus_set()

    if filename:
    try:
    video_memory = bytearray(16000)

    for y in range(self.height):
    for x in range(0, self.width, 2):
    char_col = x // 2
    char_index = y * 80 + char_col
    char_offset = char_index * 2

    video_memory[char_offset] = 0xDE

    left_pixel = self.image_data[y, x] & 0x0F
    right_pixel = self.image_data[y, x + 1] & 0x0F if x + 1 < self.width else 0
    attr_byte = ((left_pixel << 4) | right_pixel) & 0xFF
    video_memory[char_offset + 1] = attr_byte

    with open(filename, 'wb') as f:
    f.write(video_memory)

    messagebox.showinfo("Success", f"Saved PIC file: {filename}")

    except Exception as e:
    messagebox.showerror("Error", f"Failed to save PIC file:\n{str(e)}")

    self.canvas.focus_set()

    def save_png(self):
    filename = filedialog.asksaveasfilename(
    title="Save PNG file",
    defaultextension=".PNG",
    filetypes=[("PNG files", "*.PNG"), ("All files", "*.*")]
    )
    # --- FIX: Возврат фокуса ---
    self.canvas.focus_set()

    if filename:
    try:
    img_array = np.zeros((self.height, self.width, 3), dtype=np.uint8)

    for y in range(self.height):
    for x in range(self.width):
    color_index = self.image_data[y, x]
    img_array[y, x] = IBM_PC_PALETTE[color_index]

    img = Image.fromarray(img_array, 'RGB')

    if self.use_4_3_aspect:
    img = img.resize((self.width, int(self.height * 1.2)), Image.NEAREST)

    img.save(filename, 'PNG')

    messagebox.showinfo("Success", f"Saved PNG file: {filename}")

    except Exception as e:
    messagebox.showerror("Error", f"Failed to save PNG file:\n{str(e)}")

    self.canvas.focus_set()
    def main():
    root = tk.Tk()
    root.geometry("1100x700")
    root.minsize(900, 600)
    app = RGBIDrawingTool(root)
    root.mainloop()
    if __name__ == "__main__":
    main()
     
  7. Forgettable Nightmare Knight

    Forgettable

    Редактор Хелпер

    Регистрация:
    3 авг 2019
    Сообщения:
    10.250
    @Razor1977, вы же понимаете, что подобными улучшениями можно заниматься бесконечно? и что не всегда они будут улучшениями?)

    и кладите портянки под спойлер, пожалуйста
     
  8. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    Это пример - сами по этому же образцу, что то и в этом случае "не пашет" - туда же с новым вопросом-претензии)) После некоторых опытов, должно получиться))
     
  9. Forgettable Nightmare Knight

    Forgettable

    Редактор Хелпер

    Регистрация:
    3 авг 2019
    Сообщения:
    10.250
    @Razor1977, а вы "ваш" результат сами вообще тестили на работоспособность?)
     
  10. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    Это уже виднее тому, кто что делает)) Сорри за спойлер, еще не вполне освоил форум-интерфейс))

    https://ai.studio/apps/drive/1uQiYpvwCj-buQdpSjI0sprzTvIBvdWNe
    --- добавлено 18 фев 2026, предыдущее сообщение размещено: 18 фев 2026 ---
    Сина непонятно, в общедоступом билде сложно это сразу сделать, а потом рабочий код конвертировать в то, что нужно?))
    --- добавлено 18 фев 2026 ---
    Исправленный py
     

    Вложения:

  11. Forgettable Nightmare Knight

    Forgettable

    Редактор Хелпер

    Регистрация:
    3 авг 2019
    Сообщения:
    10.250
    Какой смысл выкладывать то, что вы даже не тестировали?..
     
  12. MaTocoB

    MaTocoB

    Регистрация:
    6 окт 2008
    Сообщения:
    1.027
    Очевидно, недержание...
     
    Razor1977 нравится это.
  13. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    @Forgettable, На чем "тестировали"?))
    --- добавлено 18 фев 2026, предыдущее сообщение размещено: 18 фев 2026 ---
    Re - @Razor1977, Это уже виднее тому, кто что делает))
    --- добавлено 18 фев 2026 ---
    Это публичный билд (открыл же его) - Вы, или неудержимый МаТосов - вместо очевидных глупостей можете сами туда залезть, и все что угодно - делать, ну и тем более сам "ассемблер"-творец))

    https://ai.studio/apps/drive/1uQiYpvwCj-buQdpSjI0sprzTvIBvdWNe
    --- добавлено 18 фев 2026 ---
    Что как дети малые?))
    --- добавлено 18 фев 2026 ---
    Выше я в качестве примера просто (сорри что не заспойлер) - что то не так, тут же об этом там же в билде, новым промптом. На самом деле не только Джемини, но и перечисленные в стартовом запросе кодо-автора ДипСик и тп просто не могут... не помочь)) Это же не процесс "одной попытки") В билде можно создавать все, что угодно - в данном случае от конвертеров до эмуляторов, в которых все это дело можно и тестировать (если еще как то лень)).
     
  14. MaTocoB

    MaTocoB

    Регистрация:
    6 окт 2008
    Сообщения:
    1.027
    @Razor1977, мне оно не надо, т.к. в состоянии себе подобрать инструмент и не испытывать по этому поводу, как бы по-мягче выразиться, необоснованной эйфории и желания облагодетельствовать весь мир.
     
  15. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    --- добавлено 18 фев 2026, предыдущее сообщение размещено: 18 фев 2026 ---
    Так это не желание "облагодетельствовать весь мир", а предельно чёткий ответ на конкретный вопрос чувака о баге - не простой, а ажно с готовым кодом! Может у него прям всё сразу зафурычит?)) А если не зафурычит, то тут же и ответ на вопрос, как и где проще всего сделать, что бы пусть и после некоторых усилий, но таки зафурычило)
     
  16. Gamerun

    Gamerun

    Хелпер

    Регистрация:
    13 июн 2010
    Сообщения:
    9.354
  17. Dar_Morar

    Dar_Morar

    Регистрация:
    1 янв 2015
    Сообщения:
    730
    @Razor1977 Просто пишу, что не погромист, поэтому пусть выводит код полностью. И чтобы добавил логирование. Потом или лог, или описание ошибки обратно. Не чистый вайб-инг, но пока работает. Для больших проектов пока хз. Хотя читать что написала невросетка надо, порой забывает или не понимает на чём остановились.
     
    Razor1977 нравится это.
  18. Forgettable Nightmare Knight

    Forgettable

    Редактор Хелпер

    Регистрация:
    3 авг 2019
    Сообщения:
    10.250
    "Скрипт должен быть полностью готовым к использованию и профессионального уровня: с обработкой ошибок, проверками, логированием и модульной структурой в рамках одного .py файла. Сложное лучше простого, не упрощай код, сделай его максимально надежным и готовым к использованию в production. Простые в реализации функции напиши в начале скрипта, сложные в конце, в импорты пропиши все, что может понадобиться, лучше добавить лишних, чем не добавить нужных."
     
    Dar_Morar нравится это.
  19. Razor1977

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    286
    @Dar_Morar, Спасибо за не только советы, но и еще и дельные, правда в первую очередь актуальны для "читателей выше")) Навык погромиста у меня если уж совершенно древний - на Yamaha-х MSX с basic-ами и турбо-паскалями с мохнатых 1980-х (занимался во Дворце Пионеров), на basic-ов эмуляторах если что еще и могу пробовать, то на подобном - только если в порядке експериментов)) Правда несколько удивляет реакция современных "творцов" - которые не только не в состоянии доползти до нужных инет- и не очень ии-ресурсов, но и остаются крайне недовольными когда выкидываешь из соображений взаимопомощи в качестве примера готовый код - не столь даже и важно, насколько он рабочий или нет)) Я если в Джемини и иже с ними в чем то и упражняюсь (под настроение) - то с сильно далекими от "технарей" фантазиями))
    --- добавлено 18 фев 2026, предыдущее сообщение размещено: 18 фев 2026 ---
    Смешнее всего, что в Джемини можно ваять игрушки (если речь о них) и без всяких вайб-ингов, на всё так сказать готовенькое, оперируя в промпте исключительно образными и не математическими определениями, но до этого до многих как то не доходит))
    --- добавлено 18 фев 2026 ---
    Что хотите, Арканоид устроит например, что б побыстрее?)) Называться будет Forgettable, готовый код заранее дарю))
     
  20. Forgettable Nightmare Knight

    Forgettable

    Редактор Хелпер

    Регистрация:
    3 авг 2019
    Сообщения:
    10.250
    Решили выставить себя на посмешище? Дело ваше
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление