Мне нужно, чтобы на сенсорном экране была подпись пользователя - PullRequest
0 голосов
/ 10 декабря 2018

Я делаю POS-систему и хочу включить возможность подписи после покупки.Я уже пробовал метод Tkinter с канвой, но он очень медленный и очень громоздкий, какие-либо предложения?

Вот код, с которым я сейчас работаю:

from tkinter import *

canvas_width = 500
canvas_height = 150

def paint( event ):
   python_green = "#476042"
   x1, y1 = ( event.x - 1 ), ( event.y - 1 )
   x2, y2 = ( event.x + 1 ), ( event.y + 1 )
   w.create_oval( x1, y1, x2, y2, fill = python_green )

master = Tk()
master.title( "Painting using Ovals" )
w = Canvas(master, 
           width=canvas_width, 
           height=canvas_height)
w.pack(expand = YES, fill = BOTH)
w.bind( "<B1-Motion>", paint )

message = Label( master, text = "Press and Drag the mouse to draw" )
message.pack( side = BOTTOM )

mainloop()

Кстати, этот код не мой, я получил его от этот веб-сайт

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

чистый пример:

import tkinter as tk

class Signature(tk.Canvas):
    def __init__(self, *args, **kwargs):
        self.thickness = kwargs.pop('thickness', 4)
        tk.Canvas.__init__(self, *args, **kwargs)
        self._xold = None
        self._yold = None

        self.bind('<B1-Motion>', self._on_motion)

    def _on_motion(self, event):
        x1, y1 = ( event.x - self.thickness ), ( event.y - self.thickness )
        x2, y2 = ( event.x + self.thickness ), ( event.y + self.thickness )
        event.widget.create_oval( x1, y1, x2, y2, fill='black' )
        if self._xold is not None and self._yold is not None:
            self.create_oval( x1, y1, x2, y2, fill='black' )
            self.create_line(self._xold,self._yold,event.x,event.y,smooth=True,width=self.thickness*2+1)
    # here's where you draw it. smooth. neat.
        self._xold = event.x
        self._yold = event.y

if __name__ == '__main__':
    canvas_width = '500'
    canvas_height = '500'

    root = tk.Tk()
    sig = Signature(root, width=canvas_width,height=canvas_height,bg='white', thickness=1)
    sig.pack()

    root.mainloop()

обратите внимание, что это рисует овал в позиции события и линию, соединяющую его с последним событием, это помогает сгладить линию.

0 голосов
/ 10 декабря 2018

Вот простое приложение для рисования tkinter.

from tkinter import *


b1 = "up"
xold, yold = None, None
display_width = '500'
display_height = '500'
canvas_width = '500'
canvas_height = '500'
def main():
    root = Tk()
    root.geometry((display_width+"x"+display_height))


    drawing_area = Canvas(root,width=canvas_width,height=canvas_height,bg="white")
    drawing_area.bind("<Motion>", motion)
    drawing_area.bind("<ButtonPress-1>", b1down)
    drawing_area.bind("<ButtonRelease-1>", b1up)
    drawing_area.pack(side=RIGHT)
    root.mainloop()

def b1down(event):
    global b1
    x1, y1 = ( event.x - 4 ), ( event.y - 4 )
    x2, y2 = ( event.x + 4 ), ( event.y + 4 )
    event.widget.create_oval( x1, y1, x2, y2, fill = "black" )
    b1 = "down"           # you only want to draw when the button is down
                          # because "Motion" events happen -all the time-

def b1up(event):
    global b1, xold, yold
    b1 = "up"
    xold = None           # reset the line when you let go of the button
    yold = None

def motion(event):
    if b1 == "down":
        global xold, yold
        x1, y1 = ( event.x - 4 ), ( event.y - 4 )
        x2, y2 = ( event.x + 4 ), ( event.y + 4 )
        event.widget.create_oval( x1, y1, x2, y2, fill = "black" )
        if xold is not None and yold is not None:
            python_green = "#476042"
            x1, y1 = ( event.x - 4 ), ( event.y - 4 )
            x2, y2 = ( event.x + 4 ), ( event.y + 4 )
            event.widget.create_oval( x1, y1, x2, y2, fill = "black" )
            event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE,width=9)
    # here's where you draw it. smooth. neat.
        xold = event.x
        yold = event.y

if __name__ == "__main__":
    main()
...