Tk_GetPixmap: Error from CreateDIBSection

Fermé
Noa - Modifié le 21 juil. 2023 à 17:49
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 - 27 juil. 2023 à 14:07

Bonjour, 

Je souhaite créer un logiciel qui permet de créer des interfaces,  Il y a "Ajouter un bouton", "Changer le titre" et je rajouterai d'autre fonctionnalités. Quand je créé un bouton avec nbtn (newbutton), une messagebox apparait:

  • Titre: Tk_GetPixmap: Error from CreateDIBSection
  • Contenu: L'opération a réussi

Une fois que je la ferme, ma fenêtre principale se ferme aussi. Je cherche sur internet mais sans rien trouver, c'est pourquoi je viens vous demander.

Code:
 

 
import uuid
from pc import infos
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import customtkinter as ctk
from tkinter import simpledialog
import os
import webcolors
from customtkinter import CTkImage


class MultiEntryDialog(ctk.CTkToplevel):
    def __init__(self, parent, title, entries: list):
        super().__init__(parent)
        self.title(title)

        self.entries = []

        for i, entry_name in enumerate(entries):
            ctk.CTkLabel(self, text=f"{entry_name}:").grid(row=i, sticky="w")
            entry = ctk.CTkEntry(self)
            entry.grid(row=i, column=1)
            self.entries.append(entry)

        button_frame = ctk.CTkFrame(self)
        button_frame.grid(row=len(entries), columnspan=2, pady=10)

        ok_button = ctk.CTkButton(button_frame, text="OK", command=self.ok)
        ok_button.pack(side="left")
        cancel_button = ctk.CTkButton(button_frame, text="Annuler", command=self.cancel)
        cancel_button.pack(side="left")

        self.result = None

        self.transient(parent)
        self.grab_set()
        while self.winfo_exists():
            parent.update()

        if self.result is None:
            self.result = ['', '', '']

    def ok(self):
        result = [entry.get() for entry in self.entries]
        self.destroy()
        self.result = result

    def cancel(self):
        self.destroy()
        self.result = ['', '', '']

class Constructor:
    objects = []
    objects_id = []
    def __init__(self):
        pass

class App:
    memory = []
    frames = []
    buttons = []

    def cthex(self, all_form):
        try:
            color = webcolors.rgb_to_hex(all_form)
        except:
            try:
                color = webcolors.name_to_hex(all_form)
            except Exception as e:
                color = all_form
        return color

    def add_frame(self, win, name, rw, rh, rx, ry, bg, bdw=0):
        frame = ctk.CTkFrame(win, width=(infos.screen_size_x * rw), height=(infos.screen_size_y * rh), fg_color=bg,
                             border_width=bdw)
        frame.place(x=(infos.screen_size_x * rx), y=(infos.screen_size_y * ry))
        if self.search_frame(name)[0]:
            raise RuntimeWarning(f'Frame "{name}" already exists.')
        self.frames.append([str(name), frame])

    def search_frame(self, name):
        for i, frm_infos in enumerate(self.frames):
            if name == frm_infos[0]:
                return True, i
        return False, 0

    def rem_frame(self, name):
        ex, i = self.search_frame(name)
        if not ex:
            raise RuntimeWarning(f'Frame {name} doesn\'t exist.')
        self.frames[i][1].destroy()
        del self.frames[i]

    def add_button(self, win, name, rw, rh, rx, ry, bg, bdw=0, command='', text='', image=''):
        if not command:
            command = 'None'
        if not bg:
            bg = '#6292bd'
        hex = self.cthex(bg)
        rvb = []
        rvb2 = []
        for p in webcolors.hex_to_rgb(hex):
            rvb.append(int(p))
            rvb2.append(int(p))
        for primary in range(len(rvb2)):
            rvb2[primary] += 10
        hex2 = webcolors.rgb_to_hex(rvb2)
        w, h = int(infos.screen_size_x * rw), int(infos.screen_size_y * rh)
        if image:
            img = Image.open(image)
            img.thumbnail((w ** 1, h ** 1))
            imgtk = CTkImage(img)
        else:
            img = Image.new('RGB', (1, 1), tuple(rvb))
            imgtk = CTkImage(img)
            imgtk.configure(size=(1, 1))
        if img.width + len(text) * 8 > w and image:
            w += (img.width + len(text) * 8) - w
        self.memory.append(imgtk)
        button = ctk.CTkButton(win, image=imgtk, text=text, width=w, height=h, command=eval(command),
                                compound='left',
                                border_width=bdw, fg_color=bg, bg_color='#2b2b2b', hover_color=hex2)
        button.place(x=(infos.screen_size_x * rx - w / 2), y=(infos.screen_size_y * ry + h / 2) + 1)
        if self.search_frame(name)[0]:
            raise RuntimeWarning(f'Frame "{name}" already exists.')
        self.buttons.append([str(name), button, imgtk])

    def search_button(self, name):
        for i, btn_infos in enumerate(self.buttons):
            if name == btn_infos[0]:
                return True, i
        return False, 0

    def rem_button(self, name):
        ex, i = self.search_button(name)
        if not ex:
            raise RuntimeWarning(f'Button {name} doesn\'t exist.')
        self.buttons[i][1].destroy()
        del self.buttons[i]

    def update_theme(self, theme):
        ctk.set_appearance_mode(theme)
        self.theme = theme

    def title(self):
        dialog = MultiEntryDialog(self.win, '', ['New title'])
        self.win.title(dialog.result[0])


    def nbtn(self):
        x, y = 0, 0
        w, h = 0, 0
        sx, sy = infos.screen_size_x, infos.screen_size_y
        new_button = ctk.CTkButton(master=self.win, text='', compound='left')
        while not infos.is_clicking:
            pass
        while infos.is_clicking:
            pass
        while not infos.is_clicking:
            x, y = infos.get_pos()
            w, h = new_button.winfo_width(), new_button.winfo_height()
            new_button.place(x=x * 0.8 - w // 2.5, y=y * 0.8 - h)
            self.win.update()
        rx, ry = (x * 0.8 - w // 2.5) / infos.screen_size_x, (y * 0.8 - h) / infos.screen_size_y
        dialog = MultiEntryDialog(self.win, 'New Button', ['Text', 'Color', 'Command'])
        if not dialog.result[0]:
            print(dialog.result)
            new_button.destroy()
            return None
        if not dialog.result[2]:
            dialog.result[2] = ''
        name = uuid.uuid4()
        self.add_button(self.win, name, w, h, rx, ry, bg=dialog.result[1], bdw=0, command=dialog.result[2], text=dialog.result[0],
                        image='')
        self.win.update()
        new_button.destroy()
        self.file_write(
            f'objects.append(["button", ["{name}", 0.03, 0.02, {rx}, {ry}, "#282d36", 0, "pass", "{dialog.result[0]}", ""]])\n')

    def file_write(self, to_write):
        self.file_result.write(to_write)

    def __init__(self, title='Windows Tool Kit Interface Creator', theme=None, background='white', style='default',
                 logo_path=None, objects=None):
        self.theme = None
        basic = open('basic', 'r')
        self.file_result = open('result.py', 'w')
        self.file_result.write(basic.read() + '\nobjects = []\n')
        if objects is None:
            objects = []
        self.win = ctk.CTk()
        if theme:
            try:
                self.update_theme(theme)
            except:
                raise RuntimeWarning(f'Theme {theme} doesn\'t exist')
        self.win.geometry(f'{infos.screen_size_x}x{infos.screen_size_y}')
        self.win.title(title)
        self.win.state('zoomed')
        self.win.iconbitmap(logo_path)
        self.win.configure(background=background)
        self.style = ttk.Style()
        self.style.theme_use(style)
        for _type, args in objects:
            if _type == 'frame':
                self.add_frame(self.win, args[0], args[1], args[2], args[3], args[4], args[5], args[6])
            elif _type == 'button':
                self.add_button(self.win, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
                                args[8], args[9])
        if logo_path:
            p1 = tk.PhotoImage(file=logo_path)
            self.win.iconphoto(False, p1)
        while True:
            try:
                self.win.winfo_exists()
            except:
                break
            self.win.update()

App(background='dark gray', theme='Dark', style='vista', logo_path='logo.png',
    objects=[['frame', ['lbframe', 0.1, 1, 0, 0, '#2b2b2b', 0]],
             ['frame', ['rbframe', 0.1, 1, 0.9, 0, '#282d36', 0]],
             ['frame', ['cbar', 1, 0.03, 0, 0, '#2b2b2b', 0]],
             ['button', ['b1', 0.03, 0.02, 0.03, 0.05, '#282d36', 0, 'self.title', 'Change Title', '']],
             ['button', ['b1', 0.03, 0.02, 0.03, 0.08, '#282d36', 0, 'self.nbtn', 'Add Button', '']], ])


Windows / Opera 100.0.0.0

6 réponses

Diablo76 Messages postés 218 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 30 avril 2025 57
18 juil. 2023 à 16:26

Salut,

Difficile de t'aider avec un tel code :

Des imports que l'on ne connait pas.

Fichier en lecture et écriture dont on ne connait pas le contenu (qui ne sont pas refermés d'ailleurs).

Il faut poster un code minimaliste qui génère cette erreur.

0

Ok ????.
Voici les 2 méthodes qui peuvent générer des erreurs:

 def add_button(self, win, name, rw, rh, rx, ry, bg, bdw=0, command='', text='', image=''):
    if not command:
        command = 'None'
    if not bg:
        bg = '#6292bd'
    hex = self.cthex(bg)
    rvb = []
    rvb2 = []
    for p in webcolors.hex_to_rgb(hex):
        rvb.append(int(p))
        rvb2.append(int(p))
    for primary in range(len(rvb2)):
        rvb2[primary] += 10
    hex2 = webcolors.rgb_to_hex(rvb2)
    w, h = int(infos.screen_size_x * rw), int(infos.screen_size_y * rh)
    if image:
        img = Image.open(image)
        img.thumbnail((w ** 1, h ** 1))
        imgtk = CTkImage(img)
    else:
        img = Image.new('RGB', (1, 1), tuple(rvb))
        imgtk = CTkImage(img)
        imgtk.configure(size=(1, 1))
    if img.width + len(text) * 8 > w and image:
        w += (img.width + len(text) * 8) - w
    self.memory.append(imgtk)
    button = ctk.CTkButton(win, text=text, width=w, height=h, command=eval(command),
                            compound='left',
                            border_width=bdw, fg_color=bg, bg_color='#2b2b2b', hover_color=hex2)
    button.place(x=(infos.screen_size_x * rx - w / 2), y=(infos.screen_size_y * ry + h / 2) + 1)
    if self.search_frame(name)[0]:
        raise RuntimeWarning(f'Frame "{name}" already exists.')
    self.buttons.append([str(name), button, imgtk])
def nbtn(self):
    x, y = 0, 0
    w, h = 0, 0
    sx, sy = infos.screen_size_x, infos.screen_size_y
    new_button = ctk.CTkButton(master=self.win, text='', compound='left')
    while not infos.is_clicking:
        pass
    while infos.is_clicking:
        pass
    while not infos.is_clicking:
        x, y = infos.get_pos()
        w, h = new_button.winfo_width(), new_button.winfo_height()
        new_button.place(x=x * 0.8 - w // 2.5, y=y * 0.8 - h)
        self.win.update()
    rx, ry = (x * 0.8 - w // 2.5) / infos.screen_size_x, (y * 0.8 - h) / infos.screen_size_y
    dialog = MultiEntryDialog(self.win, 'New Button', ['Text', 'Color', 'Command'])
    if not dialog.result[0]:
        print(dialog.result)
        new_button.destroy()
        return None
    if not dialog.result[2]:
        dialog.result[2] = ''
    name = uuid.uuid4()
    self.add_button(self.win, name, w, h, rx, ry, bg=dialog.result[1], bdw=0, command=dialog.result[2], text=dialog.result[0],
                    image='')
    self.win.update()
    new_button.destroy()
    self.file_write(
        f'objects.append(["button", ["{name}", 0.03, 0.02, {rx}, {ry}, "#282d36", 0, "pass", "{dialog.result[0]}", ""]])\n')


Imports inconnus:

J'importe la classe infos du pc.py qui contient des informations sur l'ordinateur, tel que les dimensions de l'écran (infos.screen_sizex...),  les positions de la souris (infos.get_pos())

nbtn consiste à créer un bouton temporaire qui va se déplacer sur la souris
jusqu'à ce que clique sur l'écran (pour le placer), une fois placé, il ouvre une boite de dialogue pour demander ce qui doit être écrit dedans, la couleur et la commande.

Une fois que l'utilisateur ferme la boite de dialogue, le bouton temporaire est
détruit pour en créer un nouveau avec self.add_button()

Et à partir du moment où je rentre les informations du bouton, l'erreur se déclenche, comme dit précédemment.

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
20 juil. 2023 à 13:32

Bonjour,

C'est ça que tu appelles un code minimaliste ?

C'est quoi import uuid ?

De plus il faut poster le code de cette façon:

https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

Visuellement, ça doit ressembler à ça:

for k in range(10):
    print(k)
0
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 7 846
21 juil. 2023 à 18:04

@Noa, juste pour préciser la demande de Phil, il faut que ton code puisse, suite à un simple copier coller, être exécuté tel quel et déclencher l'erreur.

  • Il ne doit pas dépendre de fichier tiers (ou alors il faut reporter leur contenu, idéalement minimal)
  • Il ne doit pas dépendre de modules (à moins que ces modules ne soient standard ou que tu indiques comment les récupérer).

Si on ne peut pas reproduire ton problème, on peut difficilement en comprendre la cause.

@Phil_1857 StatutMembre

C'est quoi import uuid ?

Chez moi ce module semble exister de base (je ne l'ai ni installé via PIP ni APT) et je l'ai déjà vu par le passé dans du code. Au besoin, le module en question est disponible sur pypi (voir ce lien) et est présenté ici.

0
import uuid
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import customtkinter as ctk
import os
import webcolors
from customtkinter import CTkImage

class infos:
    import ctypes
    import pyautogui
    from pynput import mouse

    def on_mouse_press(x, y, button, pressed):
        if pressed:
            infos.is_clicking = True
        else:
            infos.is_clicking = False

    @staticmethod
    def get_titlebar_size():
        SM_CYSIZE = 31
        user32 = infos.ctypes.windll.user32
        titlebar_height = user32.GetSystemMetrics(SM_CYSIZE)
        return titlebar_height

    @staticmethod
    def get_pos():
        infos.current_mouse_x = infos.pyautogui.position()[0]
        infos.current_mouse_y = infos.pyautogui.position()[1]
        return infos.current_mouse_x, infos.current_mouse_y

    @staticmethod
    def on_click(x, y, button, pressed):
        if button == mouse.Button.left:
            infos.is_clicking = True
        else:
            infos.is_clicking = False

    user32 = ctypes.windll.user32
    screen_size_x = user32.GetSystemMetrics(0)
    screen_size_y = user32.GetSystemMetrics(1)
    center_screen_x = screen_size_x // 2
    center_screen_y = screen_size_y // 2
    ratio = screen_size_x / screen_size_y
    pxl_size_x = screen_size_x // 480
    pxl_size_y = screen_size_y // 360
    current_mouse_x, current_mouse_y = 0, 0
    is_clicking = False

    mouseListener = mouse.Listener(on_click=on_mouse_press)
    mouseListener.start()

    @staticmethod
    def ctr(xy: list):
        rx = xy[0] / infos.screen_size_x
        ry = xy[1] / infos.screen_size_y
        return [rx, ry]


class MultiEntryDialog(ctk.CTkToplevel):
    def __init__(self, parent, title, entries: list):
        super().__init__(parent)
        self.title(title)

        self.entries = []

        for i, entry_name in enumerate(entries):
            ctk.CTkLabel(self, text=f"{entry_name}:")\
                .grid(row=i, sticky="w")
            entry = ctk.CTkEntry(self)
            entry.grid(row=i, column=1)
            self.entries.append(entry)

        button_frame = ctk.CTkFrame(self)
        button_frame.grid(row=len(entries), columnspan=2, 
                          pady=10)

        ok_button = ctk.CTkButton(button_frame, text="OK"
                                  , command=self.ok)
        ok_button.pack(side="left")
        cancel_button = ctk.CTkButton(button_frame, 
                                      text="Annuler",
                                      command=self.cancel)
        cancel_button.pack(side="left")

        self.result = None

        self.transient(parent)
        self.grab_set()
        while self.winfo_exists():
            parent.update()

        if self.result is None:
            self.result = [''] * len(entries)

    def ok(self):
        result = [entry.get() for entry in self.entries]
        self.destroy()
        self.result = result

    def cancel(self):
        self.destroy()

class Constructor:
    objects = []
    objects_id = []
    def __init__(self):
        pass

class App:
    memory = []
    frames = []
    buttons = []

    def cthex(self, all_form):
        try:
            color = webcolors.rgb_to_hex(all_form)
        except:
            try:
                color = webcolors.name_to_hex(all_form)
            except Exception as e:
                color = all_form
        return color

    def add_frame(self, win, name, rw, rh, rx, ry, bg, bdw=0):
        frame = ctk.CTkFrame(win,
                             width=(infos.screen_size_x * rw),
                             height=(infos.screen_size_y * rh),
                             fg_color=bg,
                             border_width=bdw)
        frame.place(x=(infos.screen_size_x * rx),
                    y=(infos.screen_size_y * ry))
        if self.search_frame(name)[0]:
            raise RuntimeWarning(f'Frame "{name}" already exists.')
        self.frames.append([str(name), frame])

    def search_frame(self, name):
        for i, frm_infos in enumerate(self.frames):
            if name == frm_infos[0]:
                return True, i
        return False, 0

    def rem_frame(self, name):
        ex, i = self.search_frame(name)
        if not ex:
            raise RuntimeWarning(f'Frame {name} doesn\'t exist.')
        self.frames[i][1].destroy()
        del self.frames[i]

    def add_button(self, win, name,
                   rw, rh, rx, ry, bg,
                   bdw=0, command='', text='', image=''):
        if not bg:
            bg = '#FF0000'
        rvb1 = webcolors.hex_to_rgb(bg)
        rvb2 = rvb1
        new_rvb = []
        for p in rvb2:
            new_rvb.append(p + 50)
        hex1 = webcolors.rgb_to_hex(new_rvb)
        if not command:
            command = 'lambda: None'
        w, h = int(infos.screen_size_x * rw),\
               int(infos.screen_size_y * rh)
        if image:
            img = Image.open(image)
            img.thumbnail((w ** 1, h ** 1))
            imgtk = CTkImage(img)
        else:
            img = Image.new('RGB', (1, 1), rvb1)
            imgtk = CTkImage(img)
            imgtk.configure(size=(1, 1))
        if img.width + len(text) * 8 > w and image:
            w += (img.width + len(text) * 8) - w
        self.memory.append(imgtk)
        button = ctk.CTkButton(win, text=text,
                               width=w, height=h, 
                               command=eval(command),
                               compound='left',
                               border_width=bdw,
                               fg_color=bg, 
                               bg_color='#2b2b2b',
                               hover_color=hex1)
        button.place(x=(infos.screen_size_x * rx - w / 2),
                     y=(infos.screen_size_y * ry + h / 2) + 1)
        if self.search_frame(name)[0]:
            raise RuntimeWarning(f'Frame "{name}" already exists.')
        self.buttons.append([str(name), button, imgtk])

    def search_button(self, name):
        for i, btn_infos in enumerate(self.buttons):
            if name == btn_infos[0]:
                return True, i
        return False, 0

    def rem_button(self, name):
        ex, i = self.search_button(name)
        if not ex:
            raise RuntimeWarning(f'Button {name} doesn\'t exist.')
        self.buttons[i][1].destroy()
        del self.buttons[i]

    def update_theme(self, theme):
        ctk.set_appearance_mode(theme)
        self.theme = theme

    def title(self):
        dialog = MultiEntryDialog(self.win, '', ['New title'])
        self.win.title(dialog.result[0])


    def nbtn(self):
        x, y = 0, 0
        w, h = 0, 0
        sx, sy = infos.screen_size_x, \
                 infos.screen_size_y
        new_button = ctk.CTkButton(master=self.win,
                                   text='', compound='left')
        while not infos.is_clicking:
            pass
        while infos.is_clicking:
            pass
        while not infos.is_clicking:
            x, y = infos.get_pos()
            w, h = new_button.winfo_width(), \
                   new_button.winfo_height()
            new_button.place(x=x * 0.8 - w // 2.5, y=y * 0.8 - h)
            self.win.update()
        rx, ry = (x * 0.8 - w // 2.5) / infos.screen_size_x, \
                 (y * 0.8 - h) / infos.screen_size_y
        dialog = MultiEntryDialog(self.win,
                                  'New Button', 
                                  ['Text', 'Color', 'Command'])
        if not dialog.result[0]:
            print(dialog.result)
            new_button.destroy()
            return None
        if not dialog.result[2]:
            dialog.result[2] = ''
        name = uuid.uuid4()
        self.add_button(self.win, name, w, h, rx,
                        ry, bg=dialog.result[1], 
                        bdw=0,
                        command=dialog.result[2], 
                        text=dialog.result[0],
                        image='')
        self.win.update()
        new_button.destroy()
        self.file_write(
            f'objects.append(["button", ["{name}", 0.03, 0.02,'
            f' {rx}, {ry}, "#282d36", 0, "pass", "{dialog.result[0]}'
            f'", ""]])\n')

    def file_write(self, to_write):
        self.file_result.write(to_write)

    def __init__(self, title='Windows Tool Kit Interface Creator',
                 theme=None, background='white', style='default',
                 logo_path=None, objects=None):
        self.theme = None
        basic = open('basic', 'r')
        self.file_result = open('result.py', 'w')
        self.file_result.write(basic.read() + '\nobjects = []\n')
        if objects is None:
            objects = []
        self.win = ctk.CTk()
        if theme:
            try:
                self.update_theme(theme)
            except:
                raise RuntimeWarning(f'Theme {theme} doesn\'t exist')
        self.win.\
            geometry(f'{infos.screen_size_x}x{infos.screen_size_y}')
        self.win.title(title)
        self.win.state('zoomed')
        self.win.iconbitmap(logo_path)
        self.win.configure(background=background)
        self.style = ttk.Style()
        self.style.theme_use(style)
        for _type, args in objects:
            if _type == 'frame':
                self.add_frame(self.win, args[0], args[1],
                               args[2], args[3], args[4], 
                               args[5], args[6])
            elif _type == 'button':
                self.add_button(self.win, args[0], args[1], 
                                args[2], args[3], args[4],
                                args[5], args[6], args[7],
                                args[8], args[9])
        if logo_path:
            p1 = tk.PhotoImage(file=logo_path)
            self.win.iconphoto(False, p1)
        while True:
            try:
                self.win.winfo_exists()
            except:
                break
            self.win.update()

App(background='dark gray', theme='Dark', style='vista',
    logo_path='logo.png',
    objects=[['frame', ['lbframe', 0.1, 1, 0, 0, '#2b2b2b', 0]],
             ['frame', ['rbframe', 0.1, 1, 0.9, 0, '#282d36', 0]],
             ['frame', ['cbar', 1, 0.03, 0, 0, '#2b2b2b', 0]],
             ['button', ['b1', 0.03, 0.02, 0.03, 0.05, '#282d36',
                         0, 'self.title', 'Change Title', '']],
             ['button', ['b1', 0.03, 0.02, 0.03, 0.08, '#282d36', 0,
                         'self.nbtn', 'Add Button', '']], ])
0

Je ne sais pas si cette version du code répond à votre définition de minimaliste, 
normalement on peut le copier-coller et c'est senser marcher.
Merci

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 27 juil. 2023 à 12:55

Bonjour,

C'est censé marcher ?

Un code minimaliste, c'est un code d'une dizaine ou quinzaine de lignes avec

juste ce qu'il faut pour mettre l'erreur en évidence

De plus, il faut poster le code en utilisant les balises, comme on te l'indique

plus haut:

https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

Visuellement, ça doit ressembler à ça:

for k in range(10):
    print(k)
0
mamiemando Messages postés 33654 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2025 7 846
27 juil. 2023 à 14:07

Bonjour Noa

Je ne sais pas si cette version du code répond à votre définition de minimaliste, 

C'est mieux, mais ça n'est pas encore ça. En gros il faut enlever tous les blocs / fonctions de code qui ne sont pas utiles pour déclencher ton bug, tout en gardant un programme exécutable en se contentant d'un copier coller.

Je t'invite aussi à reporter l'erreur complète (avec la pile d'appel), cela te permettra de savoir quelle fonction a planté et à quel endroit. Il suffit de garder toutes les sections de code qui ont été traversées jusqu'ici pour faire un premier coup de ménage. Ensuite il faut idéalement supprimer les sections de code qui ont été traversées et qui n'ont pas de rôle dans le déclenchement du problème.

Le code supprimé te permettra ensuite de virer pas mal d'imports (et pour nous, de ne pas avoir à installer pleins de modules qui n'ont rien à voir avec le problème).

On peut le copier-coller et c'est sensé marcher.

Étant sous Linux, je ne vais pas pouvoir pour ma part reproduire ton erreur car CreateDIBSection est une fonction windows, ce qui laisse penser que tu utilises un paquet python spécifique à windows.

Selon cette page, en C, il est possible de récupérer la dernière erreur.

Selon cette page, ton bug pourrait être dû à des modules obsolètes (essaye de les mettre à jour).

Je suis par ailleurs un peu sceptique sur le fait d'utiliser customtkinter, là où tkinter me paraît suffisant (pourquoi une tk.Image ne suffit pas là où tu crées un ctk.CtkImage) ? Essaye de nous expliquer, une fois ton code encore plus minimisé, ce que tu cherches à faire.

Bonne chance

0