我正在制作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()
此代码不是我的,我是从this网站获得的
答案 0 :(得分:4)
这是一个简单的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()
答案 1 :(得分:4)
一个干净的例子:
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()
请注意,这在事件的位置绘制了一个椭圆形,并用一条线将其与最后一个事件连接在一起,这有助于使线条平滑。