Seite 1 von 1

Zeichenfeld

Verfasst: Samstag 18. März 2017, 16:47
von aleph
Wie mache ich mit Tkinter ein Fenster, in dem man mit einem Pinsel als Mauszeiger einer bestimmten Dicke in ein Zeichenfeld zeichnen kann?

Re: Zeichenfeld

Verfasst: Dienstag 21. März 2017, 15:47
von Midori
Hallo Aleph! Also ich habe hier gerade einen Thread erstellt wo eventuell ein Ansatz vorhanden ist um das zu lösen. Ob es richtig ist weiß ich nicht aber vielleicht hilft es dir ja. Ansonsten gibt es auch hier unter "Painting Interactively into a Canvas" noch einen Beschreibung dazu.

Re: Zeichenfeld

Verfasst: Dienstag 21. März 2017, 16:05
von BlackJack
@aleph: Was ist denn das Ziel? Also was möchtest Du als Ergebnis haben und was soll damit gemacht werden?

Re: Zeichenfeld

Verfasst: Donnerstag 20. April 2017, 17:41
von Alfons Mittelmeyer
@aleph: Du kannst das ja einmal mit meinem GuiDesigner ausprobieren.

Hier findest Du den GuiDesigner: https://github.com/AlfonsMittelmeyer/py ... -messaging

Den kannst Du mittels grünem Button "Clone or download" als Zip file herunterladen.
Das entpackst Du dann, offnest ein terminal window oder Eingabeaufforderungsfender, gehst in das Verzeichnis GuiDesigner und rufst dann auf:

python3 main.py

Es erscheinen dann zwei Fenster. Ein kleineres, das mit tk betitelt ist. Das ist das Anwendungsfenster.
Und ein größeres Toplevel-window, das mit tkinter GuiDesigner beschriftet ist.

Mit dem Guidesigner kannst Du Dir dann anschauen, wie man machen kanns, was Du willst.

Zuerst einen Canvas erzeugen.

Am Gui Designer drückst Du oben in der Menüzeile den grünen Button "Create On". Dann erscheint links der "Create Widget" Frame.
Unter "Select Widet Type" wählst Du "Canvas" und drückst dann bei "Create Widget" den grünen "Create" Button.
Dann drückst Du etwa beim "Layout" teil unter "pack" den grünen button "TOP". Und der Canvas ist da. Ein Canvas ist wie ein Frame aber man kann darauf zusätzlich zeichnen mit Vektorgrafik und grafische Objekte wie Images und Bitmaps platzieren.

Cursor ändern

Pinsel als Cursor? Einen Pinsel Cursor hat Python nicht. Darf es ein Bleistift Cursor sein? Das kannst Du ja jetzt tun.
Aber zuvor öffnen wir das "Paint Canvas" Fenster durch Drücken des grauen Buttons mit der blauen Beschriftung "Paint Canvas".
Es öffnet sich jetzt ein weiteres Fenster mit der Beschriftung "Canvas Drawing".
Config ON".

Dort wählen wir das Freihand Zeichnen aus. Das ist das nicht gefüllte Herzchen mit schwarzem Rand. Wenn wir das getan haben, und die Maus über das Anwendungsfenster bewegen (Titel tk), ist der Fadenkreuzcursor eingeschaltet.
Das kann man natürlich ändern.Wenn im Frame "Selection" noch "canvas" ausgewählt ist, kann man für den Canvas den Cursor ändern.
Dazu drückt man im GuiDesigner in der Menüleiste den grünen Button "Config ON".

Jetzt muss man bei "Config" die Liste etwas nach unten scrollen und findet dann die Option "cursor" bei welcher "crosshair" eingetragen ist. Wenn man rechts davon auf das Fragezeichen drückt, erschein eine Auswahl weiterer Cursors.
Leider ist kein Pinsel dabei. Aber "pencil" also Bleistift gibt es. Diesen auswählen, das Cursor Auswahlfenster schließen und wenn man dann die Maus über den Canvas im Anwendungsfenster bewegt, hat man den "pencil" als Mauszeiger.

Leider kann man die Dicke des Bleistift Mauszeigers nicht verändern.

Freihand zeichnen

Schon verändern kann man die Liniendicke. Dazu einfach einmal kurz eine Linie zeichnen. Die können wir ändern. Unter "Config" finden wir die Option "width" für die Breite. Da kann man ja einmal 5 nehmen. Und unter "fill" finden wir die Farbe. Da kann man ja einmal "blue" eintragen. Wenn diese Einstellungen für weiteres Linienzeichnen gelten soll, kreuzt man im "Canvas Drawing" Fenster unter "Settings" das Kästchen "line default" an. Will man diese Settings später wieder ändern, dann Häkchen entfernen und wieder neu setzen.

Diese Linie, die wir zum Einstellen benützten, löschen wir mit dem Button "delete" ganz rechts unten im "Canvas Drawing" Fenster.

Jetzt kannst Du dann einmal Freihand Zeichen. Mit "select" und Linie auswählen und "delete" kannst Du wieder Linien löschen.

Vielleicht hilft Dir das etwas?

Beispiel für Freihand zeichnen

Verfasst: Donnerstag 20. April 2017, 20:45
von Alfons Mittelmeyer
@aleph: habe Dir ein Beispiel für Freihandzeichnen erstellt

Code: Alles auswählen

import tkinter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.canvas = tk.Canvas(self,bg='white',cursor='pencil')
        self.canvas.pack()
        self.line_default = { 'width' : 5, 'fill' : 'blue' }
        self.poly_coord = []
        self.paint_enabled=False
        self.canvas_item = None
        self.canvas.bind('<Button-1>',self.begin_paint)
        self.canvas.bind('<ButtonRelease-1>',self.stop_paint)

    def begin_paint(self,event):
        self.paint_enabled = True
        xc,yc = self.get_coord()
        self.poly_coord = [xc,yc,xc,yc]
        self.canvas_item = self.canvas.create_line(*self.poly_coord)
        self.canvas.itemconfig(self.canvas_item,**self.line_default)
        self.mouse_move_freehand()
 
    def stop_paint(self,event):
        self.paint_enabled = False
        
    def get_coord(self):
        xw = self.canvas.winfo_pointerx()-self.canvas.winfo_rootx()
        yw = self.canvas.winfo_pointery()-self.canvas.winfo_rooty()
        return self.canvas.canvasx(xw), self.canvas.canvasy(yw)

    def mouse_move_freehand(self):
        if self.paint_enabled:
            step = 10
            xc,yc = self.get_coord()
            self.poly_coord.append(xc)
            self.poly_coord.append(yc)
            self.canvas.coords(self.canvas_item,*self.poly_coord)
            self.canvas.after(step,self.mouse_move_freehand)


Application().mainloop()