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

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

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

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

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

?

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

  1. Да.

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

    12 голосов
    9,6%
  3. Разумеется!

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

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

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

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

    56 голосов
    44,8%
  1. Razor1977

    Razor1977

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

    Forgettable

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

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

    Razor1977

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

    Strategus

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

    Gamerun

    Хелпер

    Регистрация:
    13 июн 2010
    Сообщения:
    9.294
    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
    Сообщения:
    160
    @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 Ну было и было

    Forgettable

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

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

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

    Razor1977

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

    Forgettable

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

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

    Razor1977

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

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

    Вложения:

  11. Forgettable Ну было и было

    Forgettable

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

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

    MaTocoB

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

    Razor1977

    Регистрация:
    7 фев 2012
    Сообщения:
    160
    @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
    Сообщения:
    701
    @Razor1977, мне оно не надо, т.к. в состоянии себе подобрать инструмент и не испытывать по этому поводу, как бы по-мягче выразиться, необоснованной эйфории и желания облагодетельствовать весь мир.
     
  15. Razor1977

    Razor1977

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

    Gamerun

    Хелпер

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

    Dar_Morar

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

    Forgettable

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

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

    Razor1977

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

    Forgettable

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

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