Quantcast
Channel: Recent Questions - Stack Overflow
Viewing all articles
Browse latest Browse all 22484

Python Kivy - Center a opened file in paint app

$
0
0

I'm a pretty much beginner coder creating a python paint app using kivy but when I open a file to draw on it, it only opens in the bottom left whereas I would like it to open it at the center and bigger, my app ain't that pretty at the moment but i'd rather make everything work before making it pretty, can you help me ?

from kivy.config import Config# Les configurations doivent être définies avant d'importer d'autres modules KivyConfig.set('graphics', 'resizable', False)Config.set('graphics', 'fullscreen', 'auto')Config.set('kivy', 'exit_on_escape', '0')from kivy.app import Appfrom kivy.uix.widget import Widgetfrom kivy.uix.button import Buttonfrom kivy.graphics import Color, Ellipse, Line, Rectangle, Fbo, ClearColor, ClearBuffersfrom kivy.uix.popup import Popupfrom kivy.uix.label import Labelfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.uix.colorpicker import ColorPickerfrom kivy.uix.slider import Sliderfrom kivy.uix.filechooser import FileChooserListViewfrom kivy.uix.textinput import TextInputfrom kivy.uix.image import Imagefrom kivy.core.window import Windowclass WidgetPaint(Widget):    def __init__(self, **kwargs):        super(WidgetPaint, self).__init__(**kwargs)        self.largeur_ligne = 15        self.largeur_point = 30        self.dessin = False        self.couleur = (1, 1, 1, 1)    def definir_largeur_ligne(self, largeur):        self.largeur_ligne = largeur    def definir_largeur_point(self, largeur):        self.largeur_point = largeur    def on_touch_down(self, touch):        self.dessin = True        with self.canvas:            Color(*self.couleur)            Ellipse(pos=(touch.x - self.largeur_point / 2, touch.y - self.largeur_point / 2), size=(self.largeur_point, self.largeur_point))            touch.ud['ligne'] = Line(points=(touch.x, touch.y), width=self.largeur_ligne)    def definir_couleur(self, couleur):        self.couleur = couleur    def on_touch_move(self, touch):        ligne = touch.ud.get('ligne')        if ligne:            ligne.points += [touch.x, touch.y]    def effacer_toile(self):        self.canvas.clear()        self.dessin = Falseclass AppPaint(App):    def build(self):        parent = Widget()        self.peintre = WidgetPaint()        slider = Slider(min=1, max=70, value=15, size_hint=(None, None), size=(200, 50), pos=(295, 60))        slider.bind(value=self.adjust_brush_size)        btn_ouvrir = Button(text='Ouvrir', size_hint=(None, None), size=(100, 50), pos=(150, 285))        btn_ouvrir.bind(on_release=lambda instance: self.ouvrir_fichier())        btn_effacer = Button(text='Effacer', size_hint=(None, None), size=(100, 50), pos=(40, 585))        btn_effacer.bind(on_release=self.effacer_toile)        btn_ligne_fine = Button(text='T1', size_hint=(None, None), size=(50, 50), pos=(105, 60))        btn_ligne_fine.bind(on_release=lambda btn: self.configurer_peintre(5, 10))        btn_ligne_epaisse = Button(text='T2', size_hint=(None, None), size=(50, 50), pos=(155, 60))        btn_ligne_epaisse.bind(on_release=lambda btn: self.configurer_peintre(15, 30))        btn_ligne_plus_epaisse = Button(text='T3', size_hint=(None, None), size=(50, 50), pos=(205, 60))        btn_ligne_plus_epaisse.bind(on_release=lambda btn: self.configurer_peintre(25, 50))        btn_ligne_encore_plus_epaisse = Button(text='T4', size_hint=(None, None), size=(50, 50), pos=(255, 60))        btn_ligne_encore_plus_epaisse.bind(on_release=lambda btn: self.configurer_peintre(35, 70))        btn_quitter = Button(text='Enregistrer & Quitter', size_hint=(None, None), size=(100, 50), pos=(40, 285))        btn_quitter.bind(on_release=lambda instance: self.enregistrer())        btn_rouge = Button(size_hint=(None, None), size=(50, 50), pos=(5, 5), background_color=(5, 0, 0, 1))        btn_rouge.bind(on_release=lambda btn: self.peintre.definir_couleur((5, 0, 0, 1)))        btn_vert = Button(size_hint=(None, None), size=(50, 50), pos=(55, 5), background_color=(0, 5, 0, 1))        btn_vert.bind(on_release=lambda btn: self.peintre.definir_couleur((0, 5, 0, 1)))        btn_bleu = Button(size_hint=(None, None), size=(50, 50), pos=(105, 5), background_color=(0, 0, 5, 1))        btn_bleu.bind(on_release=lambda btn: self.peintre.definir_couleur((0, 0, 5, 1)))        btn_jaune = Button(size_hint=(None, None), size=(50, 50), pos=(155, 5), background_color=(5, 5, 0, 1))        btn_jaune.bind(on_release=lambda btn: self.peintre.definir_couleur((5, 5, 0, 1)))        btn_turquoise = Button(size_hint=(None, None), size=(50, 50), pos=(205, 5), background_color=(0, 5, 5, 1))        btn_turquoise.bind(on_release=lambda btn: self.peintre.definir_couleur((0, 5, 5, 1)))        btn_rose = Button(size_hint=(None, None), size=(50, 50), pos=(255, 5), background_color=(5, 0, 5, 1))        btn_rose.bind(on_release=lambda btn: self.peintre.definir_couleur((5, 0, 5, 1)))        btn_blanc = Button(size_hint=(None, None), size=(50, 50), pos=(305, 5), background_color=(5, 5, 5, 1))        btn_blanc.bind(on_release=lambda btn: self.peintre.definir_couleur((5, 5, 5, 1)))        self.colorpicker_btn = Button(text='Couleurs', size_hint=(None, None), size=(100, 50), pos=(5, 60))        self.colorpicker_btn.bind(on_press=self.roue_de_couleurs)        # Create color boxes        self.saved_colors = [Button(size_hint=(None, None), size=(50, 50), pos=(355 + 50 * i, 5)) for i in range(31)]        for btn in self.saved_colors:            btn.bind(on_release=lambda btn: self.peintre.definir_couleur(btn.background_color))        btn_exporter = Button(text='Exporter', size_hint=(None, None), size=(100, 50), pos=(40, 385))        btn_exporter.bind(on_release=lambda instance: self.export_to_png('dessin.png'))        parent.add_widget(self.peintre)        parent.add_widget(btn_effacer)        parent.add_widget(btn_ligne_fine)        parent.add_widget(btn_ligne_epaisse)        parent.add_widget(btn_ligne_plus_epaisse)        parent.add_widget(btn_ligne_encore_plus_epaisse)        parent.add_widget(btn_quitter)        parent.add_widget(btn_rouge)        parent.add_widget(btn_vert)        parent.add_widget(btn_bleu)        parent.add_widget(btn_jaune)        parent.add_widget(btn_turquoise)        parent.add_widget(btn_rose)        parent.add_widget(self.colorpicker_btn)        parent.add_widget(btn_blanc)        parent.add_widget(btn_ouvrir)        for btn in self.saved_colors:            parent.add_widget(btn)        parent.add_widget(slider)        parent.add_widget(btn_exporter)        self.file_chooser = FileChooserListView()        self.file_chooser.bind(on_submit=self.ouvrir_fichier_selectionné)        self.file_popup = Popup(title='Choisir un fichier', content=self.file_chooser, size_hint=(None, None), size=(400, 400))        return parent    def adjust_brush_size(self, instance, value):        # Met à jour la taille de la ligne et du point basée sur la valeur du slider        self.peintre.definir_largeur_ligne(value)        self.peintre.definir_largeur_point(value * 2)  # Par exemple, le point est toujours le double de la largeur de la ligne    def roue_de_couleurs(self, instance):        self.color_picker = ColorPicker()        self.color_picker.bind(color=self.def_couleur)        popup = Popup(title='Sélectionnez une couleur', content=self.color_picker, size_hint=(None, None), size=(400, 400))        popup.open()        popup.bind(on_dismiss=self.save_color_to_box)    def def_couleur(self, instance, color):        self.peintre.definir_couleur(color)    def ajuster_couleur(self, couleur):        facteur = 0.2        moyenne = sum(couleur[:3]) / 3        nouvelle_couleur = [(c + facteur * (c - moyenne)) for c in couleur[:3]]        nouvelle_couleur = [min(max(0, c), 1) for c in nouvelle_couleur]        return tuple(nouvelle_couleur + [couleur[3]])    def save_color_to_box(self, instance):        couleur = self.color_picker.color        satcoul = self.ajuster_couleur(couleur)        couleur_assignée = False        for btn in self.saved_colors:            if btn.background_color == [1, 1, 1, 1] and not couleur_assignée:                btn.background_color = satcoul                couleur_assignée = True    def configurer_peintre(self, largeur_ligne, largeur_point):        self.peintre.definir_largeur_ligne(largeur_ligne)        self.peintre.definir_largeur_point(largeur_point)    def effacer_toile(self, obj):        self.peintre.effacer_toile()        print('Effacé !')    def ouvrir_fichier(self):        # Afficher le FileChooser        self.file_popup.open()    def ouvrir_fichier_selectionné(self, instance, selection, _):    # Fermer le FileChooser      self.file_popup.dismiss()    # Vérifier si un fichier a été sélectionné      if selection:        chemin_fichier = selection[0]        self.peintre.effacer_toile()  # Effacer le dessin actuel        # Charger l'image et la convertir en une instruction graphique        image = Image(source=chemin_fichier, allow_stretch=True)        image.size = self.peintre.size  # Redimensionner à la taille du canvas        image.pos = (0, 0)  # Positionner en haut à gauche du canvas        with self.peintre.canvas:            # Créer un rectangle avec l'image comme texture            texture = image.texture            rectangle = Rectangle(texture=texture, pos=image.pos, size=image.size)        print(f'Fichier ouvert: {chemin_fichier}')    def export_to_png(self, filename):            print(f"Exporting to {filename}...")            try:                print('Size', self.peintre.size, 'Filename: ', filename)                self.peintre.size = (Window.size[0], Window.size[1])                self.peintre.export_to_png(filename)            except Exception as e:                print(f"Error while exporting: {e}")                raise e    def enregistrer(self):        if self.peintre.dessin:            content = BoxLayout(orientation='vertical')            msg = Label(text='Vous avez des changements non enregistrés. Voulez-vous enregistrer ?')            btn_layout = BoxLayout(size_hint_y=None, height='70', orientation='horizontal')            oui_btn = Button(text='Oui', on_release=lambda *args: self.sauvegarder_toile())            non_btn = Button(text='Non', on_release=lambda *args: App().stop())            btn_layout.add_widget(oui_btn)            btn_layout.add_widget(non_btn)            content.add_widget(msg)            content.add_widget(btn_layout)            self.save_popup = Popup(title='Confirmation de Sauvegarde', content=content, size_hint=(None, None), size=(400, 200), auto_dismiss=False)            self.save_popup.open()        else:            print('Rien à enregistrer')            self.stop()    def sauvegarder_toile(self):        if self.peintre.dessin:            # Créer une boîte de dialogue d'entrée textuelle pour saisir le nouveau nom du fichier            content = BoxLayout(orientation='vertical')            msg = Label(text='Saisissez le nouveau nom du fichier (sans extension) :')            input_filename = TextInput(hint_text='Nom du fichier')            btn_layout = BoxLayout(size_hint_y=None, height='70', orientation='horizontal')            sauvegarder_btn = Button(text='Sauvegarder', on_release=lambda *args: self.sauvegarder_avec_nom(input_filename.text))            annuler_btn = Button(text='Annuler', on_release=lambda *args: self.save_popup.dismiss())            btn_layout.add_widget(sauvegarder_btn)            btn_layout.add_widget(annuler_btn)            content.add_widget(msg)            content.add_widget(input_filename)            content.add_widget(btn_layout)            self.save_popup = Popup(title='Sauvegarder le dessin', content=content, size_hint=(None, None), size=(500, 250), auto_dismiss=False)            self.save_popup.open()        else:            print('Rien à enregistrer')    def sauvegarder_avec_nom(self, filename):        if filename:            if not filename.endswith('.png'):                filename += '.png'  # Ajouter l'extension .png si elle n'est pas déjà présente            self.export_to_png(filename)            print(f'Dessin sauvegardé sous {filename} !')        else:            print('Nom de fichier invalide.')        self.save_popup.dismiss()        AppPaint().stop()    def profil(self):        passif __name__ == '__main__':    AppPaint().run()

The code is mostly in french but I think that the problem is in the ouvrir_fichier_selectionné method, sorry about the language, it's for my coding major so I have to put it in french

I tried using Blackbox AI and CHATGPT to help me but they couldn't help so here I am asking people that knows more than me :)


Viewing all articles
Browse latest Browse all 22484

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>