日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

基于pythonGUI的图形绘图及图元编辑系统

發(fā)布時間:2023/12/14 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于pythonGUI的图形绘图及图元编辑系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄
1 語言、開發(fā)環(huán)境以及框架 1
2 數(shù)據(jù)結構 1
2.1 圖元 2
2.2 GUI框架 3
2.3 CLI類 3
3 圖元繪制、變換算法原理、實現(xiàn)及分析 4
3.1 線段的DDA算法 4
3.2 線段的Bresanham算法 6
3.3 中點橢圓算法 8
3.4 多邊形的繪制方法 11
3.5 Bezier曲線的繪制 12
3.6 B樣條曲線的繪制 15
3.7 圖元的平移 17
3.8 圖元的旋轉(zhuǎn) 17
3.9 圖元的縮放 18
3.10 線段的裁剪的Cohen-Sutherland算法 20
3.11 線段的裁剪的梁友棟-Barsky算法 24
4 框架設計 26
4.1 CLI設計 27
4.2 命令行文件的讀取和執(zhí)行 27
4.3 GUI設計 29
4.4 鼠標交互進行圖元繪制及變換 30
5 其他功能 41
5.1 拖動畫布邊界以調(diào)整畫布尺寸 41
5.2 顯示曲線控制點并隨時拖動控制點以調(diào)節(jié)曲線 41
References: 43
1 語言、開發(fā)環(huán)境以及框架
本程序使用python3.7編寫,在windows運行;圖形界面部分使用tkinter框架。
2 數(shù)據(jù)結構
本程序的主要涉及到三種數(shù)據(jù)結構,第一個是用于存放圖元信息的Primitive類及其派生類Line,Circle,Polygon等,第二個是GUI類,用于實現(xiàn)GUI交互邏輯,以及畫板和圖元信息的存放。第三個是CLI類,它是精簡的GUI類,刪去了和GUI相關的部分,保留繪圖部分。
2.1 圖元
所有的圖元都是對象,他們的基類是Primitive類,包括以下數(shù)據(jù)屬性:
1.def init(self, vertex, pno, color):
2. self.vertex = vertex
3. self.pixels = []
4. self.pno = pno
5. self.color = color
self.vertex list類型,其中每個元素是一個二元組,表示該圖元的頂點;
self.pixels list類型,元素類型同上,這個圖元光柵化后的所有像素坐標都存在;
self.pno int類型,是圖元的id
self.color 長度為3的list, 表示這個圖元的RGB值。
還包括以下方法:
self.rasterization(self): 使用圖元的頂點等信息,來求出該圖元在畫布中所有像素的位置,并將其存放在self.pixels數(shù)據(jù)屬性中;
self.get_pixels(self):返回self.pixels;若為空,則先調(diào)用上一個函數(shù)進行光柵化然后再返回。
self.get_color(self): 將self.color整理成一個24位的數(shù)字返回,供繪圖使用。
·直線類:Line繼承自Primitive類, 還有以下數(shù)據(jù)屬性:
1.def init(self, vertex, pno, method, color):
2. super().init(vertex, pno, color)
3. self.vertical = 0 # 是否存在斜率
4. self.slope = 0
5. self.method = method
self.vertical int類型,用來表示是否垂直;
self.slope int類型,是線段的斜率;若垂直,則將斜率定為10000;
self.method int類型,用來表示畫圖的算法(DDA或Bresenham)
還有以下方法:
self.DDA(self): DDA算法,用于在self.rasterization(self)中調(diào)用。
self.Bresenham(self): Bresenham算法,同上。
·橢圓類:Circle, 繼承自Primitives類,還具有以下的數(shù)據(jù)屬性:
1.def init(self, vertex, pno, color):
2. super().init(vertex, pno, color)
3. self.rx = vertex[1][0]
4. self.ry = vertex[1][1]
self.rx, self.ry int類型,長半軸的短半軸(ps. 橢圓的中心存放在self.vertex的第一個元素中)
·多邊形類:Polygon,繼承自Primitive類,還具有以下數(shù)據(jù)屬性:
1.def init(self, vertex, pno, method, is_done, color): # is_done:命令行直接完成,圖形界面要等待完成
2. super().init(vertex, pno, color)
3. self.method = method
4. self.is_done = is_done
5. self.lines = []
6. self.last_point = vertex[0]
7. self.is_updating = 0
8. self.new_point = [0, 0]
self.method int類型,用來表示畫圖的算法(DDA或Bresenham);
self.is_done int類型,用于區(qū)分命令行繪制還是鼠標繪制;
self.lines list類型,元素為Line。用來表示構成多邊形的直線;
self.last_point, self.new_point, list類型,self.is_updating int類型,均用于鼠標繪制多邊形過程中的操作。
還具有以下方法,均用于鼠標繪制多邊形:
self.updating(self, point): 鼠標拖動過程,用于動態(tài)顯示當前繪制的邊;
self.update_rasterization(self, point):鼠標松開后,用于添加剛剛繪制好的頂點和邊;
self.done(self):完成繪制后,連接第一個和最后一個點。
·曲線類:Curve,繼承自Primitive類,還具有以下數(shù)據(jù)屬性
self.alg 字符串,表示曲線繪制的算法,取值為‘Bezier’或‘B-spline’
各接口的詳細功能和具體實現(xiàn)將在后續(xù)算法和框架部分詳細描述

2.2 GUI框架
GUI框架是GUI類的一個對象,包括以下數(shù)據(jù)成員:
·窗口以及組件
self.top:主窗口
self.paper:tkinter的畫布
以及各種按鈕:self.draw_line, self.draw_circle, self.clean, self.close, self.save, self.line_DDA , self.line_Bre, self.owl, self.polygon, 等等,用來輸入坐標以繪制圖元或者改變鼠標繪制圖元的類型。
·圖元相關信息
self.primitives 由Primitive類的對象構成的list,存放著畫布中所有圖元的信息
·畫布相關信息
self.image 圖片文件,顯示在tkinter的畫布上
self.color_r, self.color_g, self.color_b 畫筆顏色
self.size_x, self.size_y 畫布大小
self.save_name 要保存的文件名
self.draw 畫筆
等等。
以及各種運行時需要的函數(shù)。各函數(shù)的功能以及實現(xiàn)的過程將在框架設計部分詳細描述。

2.3 CLI類
CLI類是進行文件輸入和繪制的對象,包括以下數(shù)據(jù)成員:
self.image 圖片文件,顯示在tkinter的畫布上
self.color_r, self.color_g, self.color_b 畫筆顏色
self.size_x, self.size_y 畫布大小
self.primitives 由Primitive類的對象構成的list,存放著畫布中所有圖元的信息
self.save_name 要保存的文件名
self.draw 畫筆
以及用來實現(xiàn)解析指令、繪制圖元等功能的函數(shù)
3 圖元繪制、變換算法原理、實現(xiàn)及分析
此部分基于Primitive類,本文轉(zhuǎn)載自http://www.biyezuopin.vip/onews.asp?id=15216圖元的繪制使用圖元的基本信息,如線段的頂點,橢圓的圓心的長短半軸,多邊形的頂點等等,來獲得圖元的需要在畫布上占據(jù)的所有像素點的坐標,并將其返回給框架。而圖元的變換(待添加)在原圖元的基礎上,對圖元進行修改并返回新的像素點坐標。

from base import* from line import* from circle import* from polygon import* from curve import*class GUI:def __init__(self):# 初始化self.init_basic()# 初始化GUI框架self.init_GUI()# 圖像顯示相關self.init_papers()# 鼠標事件相關self.init_mouse()# 基礎按鈕等self.init_buttons_basic()# 鼠標圖元變換相關self.init_change()# 命令行等其他的按鍵self.init_buttons_files()# 菜單欄:self.menubar = Menu(self.top)self.init_menubar()# 曲線的控制點顯示和拖拽self.init_curve_drawing()# packself.pack_n_run()def init_basic(self):self.color_r = 0self.color_g = 0self.color_b = 0self.size_x = 500self.size_y = 500self.primitives = [] # 已經(jīng)創(chuàng)建的圖元 用于撤銷等操作self.save_name = "temp.bmp" # 要保存的文件名self.image = Image.new("RGB", (self.size_x, self.size_y), (255, 255, 255))self.draw = ImageDraw.Draw(self.image)def init_GUI(self):self.top = Tk()self.top.title("Painting_v2.4.0")self.top.geometry("1000x600+200+0")def init_papers(self):self.is_image_scaling = 0 # 1 for left, 2 for down, 3 for bothself.photo = ImageTk.PhotoImage(self.image)self.paper = Canvas(self.top, width=1000, height=600, bg="gray")self.paper.create_image(2, 2, image=self.photo, anchor=NW)def init_buttons_basic(self):self.tmp_icon0 = self.getIcon(0)self.line_DDA = Button(self.top, command=lambda: self.set_type(self.line_type), text="直線", image=self.tmp_icon0)# self.line_Bre = Button(self.top, command=lambda: self.set_type(1), text="Bresenham直線")self.tmp_icon1 = self.getIcon(1)self.owl = Button(self.top, command=lambda: self.set_type(2), text="橢圓", image=self.tmp_icon1)self.tmp_icon2 = self.getIcon(2) # next line: 3 for dda 4 for bresenhamself.polygon = Button(self.top, command=lambda: self.set_type(3), text="多邊形", image=self.tmp_icon2)self.tmp_icon3 = self.getIcon(3)self.curve = Button(self.top, command=lambda: self.set_type(4), text="曲線", image=self.tmp_icon3)self.tmp_icon4 = self.getIcon(4)self.translate = Button(self.top, command=lambda: self.set_type(5), text="平移", image=self.tmp_icon4)self.tmp_icon5 = self.getIcon(5)self.rotate = Button(self.top, command=lambda: self.set_type(6), text="旋轉(zhuǎn)", image=self.tmp_icon5)self.tmp_icon6 = self.getIcon(6)self.scale = Button(self.top, command=lambda: self.set_type(7), text="縮放", image=self.tmp_icon6)self.tmp_icon11 = self.getIcon(11)self.clip = Button(self.top, command=lambda: self.set_type(8), text="裁剪", image=self.tmp_icon11)# self.save_but = Button(self.top, command=self.save_canvas, text="保存")self.is_polygon_painting = 0self.is_curve_painting = 0self.polygon_last_point = [0, 0]self.map = np.full((self.size_x, self.size_y), -1)def init_buttons_files(self):self.tmp_icon8 = self.getIcon(8)self.cl = Button(self.top, command=self.cmd_line_window, text="打開文件", image=self.tmp_icon8)self.tmp_icon7 = self.getIcon(7)self.colorboard = Button(self.top, command=self.color_board_window, text='調(diào)色板', image=self.tmp_icon7)# 基礎按鍵設置# self.draw_line = Button(self.top, command=self.draw_line_window, text="畫直線")# self.draw_circle = Button(self.top, command=self.draw_circle_window, text="畫橢圓")self.tmp_icon9 = self.getIcon(9)self.clean = Button(self.top, command=self.clean_pic, text="清除畫布", image=self.tmp_icon9)self.tmp_icon10 = self.getIcon(10)self.close = Button(self.top, command=self.top.destroy, text="關閉", image=self.tmp_icon10)def init_change(self):self.primitive_changing = -1self.last_point = [-1, -1]self.is_translating = 0self.rotate_point = [-1, -1]self.is_rotating = 0# self.is_primitive_rotating = 0self.start_angle = 0 # 弧度self.scale_point = [-1, -1]self.is_scaling = 0self.start_distance = 0# self.primitive_clipping = -1self.is_clipping = 0self.clip_point = [-1, -1]self.clip_alg = 'Cohen-Sutherland'self.clipped = 0self.tmp_cut_line = Line([[0, 0], [0, 0]], -1, 1, 0)# self.def init_mouse(self):self.cur = self.primitives.__len__() # 當前正在繪制的圖元的數(shù)組下標self.start_x = 0 # 圖元初始坐標self.start_y = 0self.type = 1 # 種類 0 for DDA line, 1 for Bresenham Lineself.paper.bind('<Button-1>', self.leftdown)self.paper.bind('<B1-Motion>', self.leftmove)self.paper.bind('<ButtonRelease-1>', self.leftrelease)self.paper.bind('<Double-Button-1> ', self.double_left_click)self.line_type = 1self.polygon_type = 1self.curve_type = 1def init_menubar(self):filemenu = Menu(self.menubar, tearoff=0)self.menubar.add_cascade(label='文件', menu=filemenu)filemenu.add_cascade(label='打開命令行文件', command=self.cmd_line_window)filemenu.add_command(label='清除畫布', command=self.clean_pic)filemenu.add_command(label='保存', command=self.save_by_mouse)filemenu.add_command(label='退出', command=self.top.destroy)drawmenu = Menu(self.menubar, tearoff=0)self.menubar.add_cascade(label="繪圖", menu=drawmenu)def set_draw_type(pri, type_t):if pri=='line':self.line_type = type_telif pri=='polygon':self.polygon_type = type_telif pri=='curve':if self.curve_type != type_t:self.is_curve_painting = 0self.curve_type = type_telif pri=='clip':self.clip_alg = 'Cohen-Sutherland' if type_t== 1 else 'Liang-Barsky'sub_menu_line = Menu(drawmenu, tearoff=0)drawmenu.add_cascade(label="直線繪制算法", menu=sub_menu_line)sub_menu_line.add_radiobutton(label="DDA", command=lambda: set_draw_type('line', 1)) # commandsub_menu_line.add_radiobutton(label="Bresenham", command=lambda: set_draw_type('line', 2))sub_menu_polygon = Menu(drawmenu, tearoff=0)drawmenu.add_cascade(label="多邊形繪制算法", menu=sub_menu_polygon)sub_menu_polygon.add_radiobutton(label="DDA", command=lambda: set_draw_type('polygon', 1)) # commandsub_menu_polygon.add_radiobutton(label="Bresenham", command=lambda: set_draw_type('polygon', 2))sub_menu_curve = Menu(drawmenu, tearoff=0)drawmenu.add_cascade(label="曲線繪制算法", menu=sub_menu_curve)sub_menu_curve.add_radiobutton(label="Bezier", command=lambda: set_draw_type('curve', 1)) # commandsub_menu_curve.add_radiobutton(label="B-spline", command=lambda: set_draw_type('curve', 2))sub_menu_clip = Menu(drawmenu, tearoff=0)drawmenu.add_cascade(label="直線裁剪算法", menu=sub_menu_clip)sub_menu_clip.add_radiobutton(label="Cohen-Sutherland", command=lambda: set_draw_type('clip', 1)) # commandsub_menu_clip.add_radiobutton(label="梁友棟-Barsky", command=lambda: set_draw_type('clip', 2))def init_curve_drawing(self):self.display_ctrl_point = 0self.ctrl_point_check = Checkbutton(self.top, text="顯示控制點", command=self.change_dis_ctrl_point)self.map_ctrl_point = np.full((self.size_x, self.size_y, 2), -1)self.is_curve_modifying = 0self.curve_modify_num = [-1, -1]def change_dis_ctrl_point(self):self.display_ctrl_point = 1 if self.display_ctrl_point==0 else 0self.refresh()def pack_dis_ctrl_point(self, p):if p==1:self.ctrl_point_check.grid(row=0, column=20)else:self.ctrl_point_check.grid_forget()def pack_n_run(self):# pack, TODO:位置設置self.line_DDA.grid(row=0, column=0)# self.line_DDA.place(x=0, y=0)# self.line_Bre.grid(row=0, column=1)self.owl.grid(row=0, column=1)self.polygon.grid(row=0, column=2)self.curve.grid(row=0, column=3)self.translate.grid(row=0, column=4)self.rotate.grid(row=0, column=5)self.scale.grid(row=0, column=6)self.clip.grid(row=0, column=7)self.colorboard.grid(row=0, column=8)# self.paper.grid(row=1, column=5)self.paper.place(x=0, y=30)self.cl.grid(row=0, column=9)self.clean.grid(row=0, column=10)self.close.grid(row=0, column=11)self.pack_dis_ctrl_point(1)self.pack_dis_ctrl_point(0)# self.draw_line.grid(row=3, column=0)# self.draw_circle.grid(row=3, column=1)self.top.config(menu=self.menubar)os.remove("tmp.ico")self.top.mainloop()@staticmethoddef getIcon(s):tmp = open("tmp.ico", "wb+")tmp.write(base64.b64decode(imgs.icons[s]))tmp.close()return PhotoImage(file='tmp.ico')def cmd_line_window(self):in_put = Toplevel()# in_put.wm_attributes('-topmost', 1)# in_put.withdraw()in_put.protocol('WM_DELETE_WINDOW', in_put.withdraw)in_put.title("打開文件")in_put.geometry("330x100+605+300")Label(in_put, text="文件名:").grid(row=0, column=0)Label(in_put, text="輸出圖元保存位置:").grid(row=1, column=0)file_name_path = StringVar()save_path_path = StringVar()file_name = Entry(in_put, textvariable=file_name_path)save_path = Entry(in_put, textvariable=save_path_path)file_name.grid(row=0, column=1)save_path.grid(row=1, column=1)open_file = Button(in_put, command=lambda: self.open_file(file_name_path), text="打開文件")chose = Button(in_put, command=lambda: self.select_dir(save_path_path), text="選擇文件夾")begin = Button(in_put, command=lambda: self.cmd_line_act(file_name, save_path), text="開始")close = Button(in_put, command=in_put.destroy, text="關閉")open_file.grid(row=0, column=2)chose.grid(row=1, column=2)begin.grid(row=2, column=0)close.grid(row=2, column=1)in_put.mainloop()def open_file(self, path):name = tkfl.askopenfilename(filetypes=[("文本文檔", ".txt")])print(name)path.set(name)def select_dir(self, path):name = tkfl.askdirectory()print(name)path.set(name)def save_by_mouse(self):path = StringVar()path = tkfl.asksaveasfilename(filetypes=[('bmp文件', '.bmp')])print(path)if path != '':self.save_name = pathself.save_canvas()def color_board_window(self):tmp = colorchooser.askcolor(parent=self.top, title='選擇畫筆顏色', color='blue')if tmp != (None, None):color_t =tmpself.color_r = int(color_t[0][0])self.color_g = int(color_t[0][1])self.color_b = int(color_t[0][2])print(self.color_r, self.color_g, self.color_b, color_t)def cmd_line_act(self, file_name, save_path):file = file_name.get()if file=='':file = 'input.txt'path = save_path.get()# 保存時 修改self.save_namecmd_file = open(file, "r")lines = 0 # 跨行時的參數(shù) 下面三個也是line2_id = 0line2_n = 0line2_alg = ""for cmd in cmd_file.readlines():# 如果涉及到跨行, 即多邊形和曲線, 設置一個多余的參數(shù)color = [self.color_r, self.color_g, self.color_b]words = cmd.split()if words[0] == "resetCanvas":print("reset")self.size_x = int(words[1])self.size_y = int(words[2])self.clean_pic()elif words[0] == "saveCanvas":print("save")if path != '':self.save_name = path + "/" + words[1] + ".bmp"else:self.save_name = words[1] + ".bmp"self.save_canvas()elif words[0] == "setColor":print("setColor")self.color_r = int(words[1])self.color_g = int(words[2])self.color_b = int(words[3])elif words[0] == "drawLine":print("Line")vertex = [[int(words[2]), int(words[3])], [int(words[4]), int(words[5])]]pid = int(words[1])alg = 1 if words[6]=="DDA" else 2line_2b_drawn = Line(vertex, pid, alg, color)self.primitives.append(line_2b_drawn)# print(self.primitives.__len__())self.refresh()elif words[0] == "drawPolygon":print("Polygon")lines = 1line2_id = int(words[1])line2_n = int(words[2])line2_alg = 1 if words[3]=="DDA" else 2elif words[0] == "drawEllipse":print("Ellipse")vertex = [[int(words[2]), int(words[3])], [int(words[4]), int(words[5])]]pid = int(words[1])circle_2b_drawn = Circle(vertex, pid, color)self.primitives.append(circle_2b_drawn)self.refresh()elif words[0] == "drawCurve":print("Curve")lines = 2line2_id = int(words[1])line2_n = int(words[2])# TODO: algline2_alg = 1 if words[3] == "Bezier" else 2elif words[0] == "translate":print("translate")for i in range(len(self.primitives)):if int(words[1]) == self.primitives[i].get_id():# num = iself.primitives[i].translate(int(words[2]), int(words[3]))breakself.refresh()elif words[0] == "rotate":print("rotate")for i in range(len(self.primitives)):if int(words[1]) == self.primitives[i].get_id():# num = iself.primitives[i].rotate(int(words[2]), int(words[3]), int(words[4]))breakself.refresh()elif words[0] == "scale":print("scale")for i in range(len(self.primitives)):if int(words[1]) == self.primitives[i].get_id():self.primitives[i].scale(int(words[2]), int(words[3]), float(words[4]))breakself.refresh()elif words[0] == "clip":print("clip")for i in range(len(self.primitives)):if int(words[1]) == self.primitives[i].get_id():self.primitives[i].clip(int(words[2]), int(words[3]), int(words[4]), int(words[5]), words[6])breakself.refresh()elif lines == 1: # polygonprint("Polygon, 2nd line")vertex = []for i in range(line2_n):point = [int(words[2*i]), int(words[2*i+1])]vertex.append(point)polygon_2b_drawn = Polygon(vertex, line2_id, line2_alg, 1, color)self.primitives.append(polygon_2b_drawn)self.refresh()lines = 0elif lines == 2: # curveprint("Curve, 2nd line")vertex = []for i in range(line2_n):point = [int(words[2 * i]), int(words[2 * i + 1])]vertex.append(point)alg = 'Bezier' if line2_alg == 1 else 'B-spline'curve_2b_drawn = Curve(vertex, line2_id, alg, 1, color)self.primitives.append(curve_2b_drawn)self.refresh()lines = 0else:notification = "指令\""+words[0] + "\"解析失敗"tkinter.messagebox.showinfo("提示", notification)breakdef clean_pic(self):self.paper.delete(ALL)self.primitives = []self.rotate_point = [-1, -1]self.scale_point = [-1, -1]self.primitive_changing = -1self.refresh()self.is_curve_painting = 0self.is_polygon_painting = 0self.is_rotating = 0# self.image = Image.new("RGB", (self.size_x, self.size_y), (255, 255, 255))# self.draw = ImageDraw.Draw(self.image)# self.paper.create_image(0, 0, image=self.photo, anchor=NW)print("clean_pic")def save_canvas(self):# file_name = "temp.bmp"self.image.save(self.save_name)def refresh(self):# t1 = int(round(time.time() * 1000))# self.image.show()# print("refresh!")# if self.display_ctrl_point==1:# print(1111)# else:# print("0000")self.paper.delete(ALL)self.image = Image.new("RGB", (self.size_x, self.size_y), (255, 255, 255))self.draw = ImageDraw.Draw(self.image)self.map = np.full((self.size_x, self.size_y), -1)i = 0for primitive in self.primitives:pixels = primitive.get_pixels()for point in pixels:if (point[0] >= 0) and (point[1] >= 0) and (point[0] <= self.size_x-1) and (point[1] <= self.size_y-1):# self.draw.point((point[0], point[1]), fill=self.color_r + self.color_g*256 + self.color_b*256*256)self.draw.point((point[0], point[1]), fill=primitive.get_color())if self.map[point[0]][point[1]] == -1:self.map[point[0]][point[1]] = ielse:self.map[point[0]][point[1]] = -2i = i + 1# print("drawn", primitive.pno)self.photo = ImageTk.PhotoImage(self.image)self.paper.create_image(2, 2, image=self.photo, anchor=NW)if self.rotate_point != [-1, -1]:self.paper.create_oval(self.rotate_point[0]-2, self.rotate_point[1]-2,self.rotate_point[0]+2, self.rotate_point[1]+2,fill='red')if self.scale_point != [-1, -1]:self.paper.create_oval(self.scale_point[0]-2, self.scale_point[1]-2,self.scale_point[0]+2, self.scale_point[1]+2,fill='green')if self.type>=4 and self.display_ctrl_point==1: # 繪制曲線控制點和虛線self.map_ctrl_point = np.full((self.size_x, self.size_y, 2), -1)for i in range(self.primitives.__len__()):if self.primitives[i].__class__.__name__ == 'Curve':vertex = self.primitives[i].get_vertexes()for j in range(vertex.__len__()):self.paper.create_oval(vertex[j][0]-2, vertex[j][1]-2, vertex[j][0]+2, vertex[j][1]+2)if 0<=vertex[j][0]<=self.size_x-1 and 0<=vertex[j][1]<=self.size_y-1:self.map_ctrl_point[vertex[j][0]][vertex[j][1]] = [i, j]if j >= 1:self.paper.create_line(vertex[j-1][0], vertex[j-1][1], vertex[j][0], vertex[j][1],fill='red', dash=(4, 4))if self.type == 8 and self.primitive_changing != -1 and self.primitives[self.primitive_changing].__class__.__name__=='Line':vertex = self.primitives[self.primitive_changing].get_vertexes()self.paper.create_oval(vertex[0][0] - 2, vertex[0][1] - 2,vertex[0][0] + 2, vertex[0][1] + 2,fill='blue')self.paper.create_oval(vertex[1][0] - 2, vertex[1][1] - 2,vertex[1][0] + 2, vertex[1][1] + 2,fill='blue')if self.type == 8 and self.primitive_changing != -1 and self.is_clipping==1:vertex = self.tmp_cut_line.get_vertexes()if self.tmp_cut_line.is_deleted != 1:self.paper.create_line(vertex[0][0], vertex[0][1], vertex[1][0], vertex[1][1], fill='red', width=3)vertex = [self.last_point, self.clip_point]xmax = max(vertex[0][0], vertex[1][0])xmin = min(vertex[0][0], vertex[1][0])ymax = max(vertex[0][1], vertex[1][1])ymin = min(vertex[0][1], vertex[1][1])x = [xmin, xmin, xmax, xmax]y = [ymin, ymax, ymax, ymin]for i in range(4):self.paper.create_line(x[i], y[i], x[(i+1)%4], y[(i+1)%4], fill='red', dash=(4, 4))# t2 = int(round(time.time() * 1000))# print("timecost:", t2-t1)def leftdown(self, event):self.cur = self.primitives.__len__()self.start_x = event.xself.start_y = event.ydef find(point, map_t):res = -1for i in range(point[0] - 5, point[0] + 5):for j in range(point[1] - 5, point[1] + 5):if (i >= 0) and (i <= self.size_x-1) and (j > 0) and (j <= self.size_y-1):if map_t[i][j] >= 0:if res == -1:res = map_t[i][j]elif map_t[i][j] != res:res = -1return res# print("select ", res)return resdef find_curve(point, map_t):res = [-1, -1]for i in range(point[0] - 5, point[0] + 5):for j in range(point[1] - 5, point[1] + 5):if (i >= 0) and (i <= self.size_x-1) and (j > 0) and (j <= self.size_y-1):if map_t[i][j][0] >=0:if res == [-1, -1]:res = map_t[i][j]elif map_t[i][j][0] != res[0]:res = [-1, -1]return res# print("select ", res)return rescolor = [self.color_r, self.color_g, self.color_b]if self.size_x-5 <= event.x <= self.size_x+5 and self.size_y-5 <= event.y <= self.size_y+5:self.is_image_scaling = 3elif self.size_x-5 <= event.x <= self.size_x+5:self.is_image_scaling = 1elif self.size_y-5 <= event.y <= self.size_y+5:self.is_image_scaling = 2# elif 0 <= event.x <=self.size_x and 0 <= event.y <= self.size_y:elif self.type == 0 or self.type == 1:temp_list = [[self.start_x, self.start_y], [self.start_x, self.start_y]]line_being_drawn = Line(temp_list, self.primitives.__len__(), self.line_type, color)self.primitives.append(line_being_drawn)elif self.type == 2:owl_being_drawn = Circle([[self.start_x, self.start_y], [0, 0]], self.primitives.__len__(), color)self.primitives.append(owl_being_drawn)elif self.type ==3:if self.is_polygon_painting == 0:polygon_being_drawn = Polygon([[self.start_x, self.start_y]], self.primitives.__len__(),self.polygon_type, 0, color)self.primitives.append(polygon_being_drawn)self.is_polygon_painting = 1else:self.cur -= 1self.primitives[self.cur].updating([event.x, event.y])elif self.type==4: # curvetmp = [-1, -1]if self.display_ctrl_point == 1:tmp = find_curve([event.x, event.y], self.map_ctrl_point)if tmp[0] != -1:self.is_curve_modifying = 1self.curve_modify_num = tmp# print(tmp)self.is_curve_painting = 0elif self.is_curve_painting == 0:curve_being_drawn = Curve([[self.start_x, self.start_y],[self.start_x, self.start_y]],self.primitives.__len__(),('Bezier' if self.curve_type==1 else 'B-spline'), 0, color)self.primitives.append(curve_being_drawn)self.is_curve_painting = 1else:self.cur -= 1self.primitives[self.cur].begin_update([event.x, event.y])self.refresh()elif self.type ==5:# print(self.map[50])self.primitive_changing = find([event.x, event.y], self.map)if self.primitive_changing >= 0:self.is_translating = 1self.last_point = [event.x, event.y]print("found")elif self.type == 6:print("rotate")if self.is_rotating == 0:self.rotate_point = [event.x, event.y]self.is_rotating = 1self.refresh()else:self.primitive_changing = find([event.x, event.y], self.map)if self.primitive_changing >= 0:# self.is_rotating = 1self.primitives[self.primitive_changing].change(1)if event.x == self.rotate_point[0]:self.start_angle = math.pi/2 if event.y - self.rotate_point[1] > 0 else -math.pi/2else:self.start_angle = math.atan((event.y - self.rotate_point[1])/(event.x - self.rotate_point[0]))if event.x - self.rotate_point[0] < 0:self.start_angle = self.start_angle + math.pi# self.last_point = [event.x, event.y]elif self.type == 7:if self.is_scaling == 0:self.scale_point = [event.x, event.y]self.is_scaling = 1self.refresh()else:self.primitive_changing = find([event.x, event.y], self.map)self.primitives[self.primitive_changing].change(1)if self.primitive_changing >= 0:print('a')self.start_distance = math.sqrt(pow(event.x - self.scale_point[0], 2) +pow(event.y - self.scale_point[1], 2))elif self.type == 8:if self.is_clipping == 1:# print("yyy")self.last_point = [event.x, event.y]self.clip_point = [event.x, event.y]else:self.primitive_changing = find([event.x, event.y], self.map)if self.primitive_changing >= 0 and self.primitives[self.primitive_changing].__class__.__name__=='Line':self.is_clipping = 1self.refresh()# print("press", event.x, event.y)def leftmove(self, event):x = event.xy = event.y# print("pass", x, y)# temp_list = []if self.is_image_scaling > 0:self.cur -= 1if self.is_image_scaling == 1:self.size_x = 1000 if x>=1000 else xelif self.is_image_scaling == 2:self.size_y = 600 if y>=600 else yelse:self.size_x = 1000 if x>=1000 else xself.size_y = 600 if y>=600 else yself.set_type(self.type)elif self.type == 0 or self.type == 1:temp_list = [[self.start_x, self.start_y], [x, y]]self.primitives[self.cur].vertex = temp_listself.primitives[self.cur].rasterization()elif self.type == 2:x_mid = int((x + self.start_x) / 2)y_mid = int((y + self.start_y) / 2)rx = int((abs(x - self.start_x)) / 2)ry = int((abs(y - self.start_y)) / 2)temp_list = [[x_mid, y_mid], [rx, ry]]self.primitives[self.cur].vertex = temp_listself.primitives[self.cur].rasterization()elif self.type == 3:self.primitives[self.cur].updating([x, y])# self.refresh()elif self.type == 4:if self.is_curve_modifying == 1:self.primitives[self.curve_modify_num[0]].modify(self.curve_modify_num[1], [x, y])else:self.primitives[self.cur].updating([x, y])# print(self.primitives[self.cur].vertex)# print(self.primitives[self.cur].pixels)elif self.type == 5 and self.is_translating == 1:self.primitives[self.primitive_changing].translate(x - self.last_point[0], y - self.last_point[1])self.last_point = [x, y]elif self.type == 6 and self.primitive_changing != -1:if x == self.rotate_point[0]:angle = math.pi/2 if y - self.rotate_point[1] > 0 else -math.pi/2else:angle = math.atan((y - self.rotate_point[1])/(x - self.rotate_point[0]))if x - self.rotate_point[0] < 0:angle = angle + math.piself.primitives[self.primitive_changing].rotate(self.rotate_point[0], self.rotate_point[1],(angle - self.start_angle)*180 / math.pi)self.start_angle = angle # 這里不應該叫"start"而是"last"elif self.type == 7 and self.primitive_changing != -1:cur_dis = math.sqrt(pow(event.x - self.scale_point[0], 2) +pow(event.y - self.scale_point[1], 2))self.primitives[self.primitive_changing].scale(self.scale_point[0], self.scale_point[1],cur_dis/self.start_distance)self.start_distance = cur_diselif self.type == 8 and self.primitive_changing != -1 and self.is_clipping==1:self.clip_point = [x, y]self.tmp_cut_line = Line(self.primitives[self.primitive_changing].get_vertexes(), -1,self.primitives[self.primitive_changing].get_method(), 0)# tmp_line = self.primitives[self.primitive_changing]print(self.primitives[self.primitive_changing].get_vertexes())# print(self.last_point, self.clip_point)self.tmp_cut_line.clip(self.last_point[0], self.last_point[1],self.clip_point[0], self.clip_point[1], self.clip_alg)self.clipped = 1self.refresh()# print("refreshed")def leftrelease(self, event):if self.is_image_scaling >0:self.is_image_scaling = 0elif self.type==0 or self.type == 1 or self.type == 2:self.cur = self.primitives.__len__()elif self.type == 3:self.primitives[self.cur].update_rasterization([event.x, event.y])self.polygon_last_point = [event.x, event.y]self.refresh()elif self.type == 4:if self.is_curve_modifying == 1:self.primitives[self.curve_modify_num[0]].modify(self.curve_modify_num[1], [event.x, event.y])self.is_curve_modifying = 0else:self.primitives[self.cur].updating([event.x, event.y])self.refresh()elif self.type == 5:self.is_translating = 0self.primitive_changing = -1elif self.type == 6:self.primitive_changing = -1self.primitives[self.primitive_changing].change(0)elif self.type == 7:self.primitive_changing = -1self.primitives[self.primitive_changing].change(0)elif self.type == 8 and self.clipped == 1:self.primitives[self.primitive_changing].clip(self.last_point[0], self.last_point[1],self.clip_point[0], self.clip_point[1],self.clip_alg)self.clipped = 0self.last_point = [-1, -1]self.clip_point = [-1, -1]self.is_clipping = 0self.primitive_changing = -1self.tmp_cut_line = Line([[0, 0], [0, 0]], -1, 1, 0)self.refresh()# print("release")def double_left_click(self, event): # unused# print("double!")if self.type == 3 and self.is_polygon_painting == 1:self.primitives[self.cur].update_rasterization([event.x, event.y])self.polygon_last_point = [event.x, event.y]self.refresh()def set_type(self, type_t): # 設置鼠標畫圖的類型self.type = type_tif type_t>=4 and type_t !=8:self.pack_dis_ctrl_point(1)else:self.pack_dis_ctrl_point(0)if self.is_polygon_painting == 1: # 完成多邊形的繪制self.is_polygon_painting = 0self.primitives[self.cur].done()self.refresh()if self.is_curve_painting == 1:self.is_curve_painting = 0self.refresh()if self.is_rotating:self.is_rotating = 0self.rotate_point = [-1, -1]self.refresh()if self.is_scaling:self.is_scaling = 0self.scale_point = [-1, -1]self.refresh()if self.is_clipping:self.is_clipping = 0self.last_point = [-1, -1]self.clip_point = [-1, -1]self.refresh()# self.primitive_changing = -1if __name__ == '__main__':gui = GUI()




















總結

以上是生活随笔為你收集整理的基于pythonGUI的图形绘图及图元编辑系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产精品美女www爽爽爽视频 | 日韩欧美在线免费观看 | 制服丝袜亚洲 | 一区二区三区久久精品 | 国产不卡在线观看视频 | 美女免费视频观看网站 | 狠狠色丁香婷婷综合最新地址 | 欧美一二区视频 | 欧美在线观看禁18 | 深夜免费小视频 | 最新午夜电影 | 久久婷婷一区二区三区 | 成年人黄色在线观看 | 欧美怡红院| 久久久久久久影视 | 91精品国产自产在线观看 | 99精品在这里 | 国产精品美乳一区二区免费 | 亚洲专区免费观看 | 91精品国产99久久久久久久 | 久久久久久久久亚洲精品 | 中文字幕视频播放 | 亚洲精品乱码久久久久久9色 | 国产xxxx做受性欧美88 | 四虎在线永久免费观看 | 国产精品一区二区三区久久 | 色综合天天狠天天透天天伊人 | 亚洲激情一区二区三区 | 国产午夜免费视频 | 免费人成在线观看 | 色福利网 | 人人射人人澡 | 激情五月伊人 | 成人影音av | 99热在线观看免费 | 黄色小网站免费看 | 国产麻豆精品传媒av国产下载 | 欧美成年网站 | jizz欧美性9 国产一区高清在线观看 | 国产美女永久免费 | 免费看av片网站 | 国产在线播放一区 | 91精品国产91久久久久福利 | 国产成人精品一二三区 | 免费看的av片 | 亚洲高清久久久 | 天天干天天拍 | ,午夜性刺激免费看视频 | 亚洲精品午夜aaa久久久 | 97福利在线 | 九色91在线 | 91av在线看 | 国产五月婷 | 欧美一区二区日韩一区二区 | 欧美午夜理伦三级在线观看 | 亚洲欧美视频网站 | 亚洲精品合集 | 精品999在线 | 涩涩色亚洲一区 | 在线观看一区二区视频 | 欧美日韩在线视频一区 | 欧美ⅹxxxxxx | 在线播放你懂 | 综合久久精品 | 亚洲午夜精品久久久久久久久久久久 | 精品视频免费播放 | www.黄色片网站 | 久久婷婷国产色一区二区三区 | 色视频网站免费观看 | 亚洲精品网站 | 黄色精品久久 | 日日干日日 | 免费男女网站 | 国偷自产视频一区二区久 | 亚洲成人黄色av | 中国一级片在线观看 | 国产精品麻豆三级一区视频 | 婷婷在线精品视频 | 久久久不卡影院 | 日韩精品视频免费专区在线播放 | 中文字幕在 | 亚洲另类xxxx | 成人av片在线观看 | 日日夜夜操av | 天天超碰 | 国产精品一区二区中文字幕 | 久草视频在线免费 | 亚洲va综合va国产va中文 | 91亚洲精品国偷拍自产在线观看 | 中文字幕视频在线播放 | 国产精品一区二区在线看 | 国产一二三四在线观看视频 | 欧美日韩中文字幕在线视频 | 久操视频在线免费看 | 久久久国产一区二区三区 | 国产精品va在线播放 | 免费日韩 精品中文字幕视频在线 | 婷婷五天天在线视频 | 欧美成人在线免费 | 国产+日韩欧美 | 美女黄频 | 日韩二区精品 | 一区二区毛片 | 在线电影 一区 | 成人一区电影 | 欧美性受极品xxxx喷水 | 欧亚久久 | 国产一区在线视频 | 国产精品福利在线 | 最近中文字幕在线中文高清版 | 国产综合精品一区二区三区 | 在线视频精品播放 | 夜夜躁日日躁狠狠躁 | 日韩首页 | 4438全国亚洲精品观看视频 | 国产五月天婷婷 | 视频在线91 | 久久综合狠狠综合久久狠狠色综合 | 亚洲一级国产 | 日韩欧美精品在线视频 | 色www永久免费| 人人干97| 日韩在线视频在线观看 | 在线免费精品视频 | 插婷婷| 99re国产 | 中文字幕麻豆 | 国产91aaa| 福利片免费看 | 97热久久免费频精品99 | www.福利| 中国一级片免费看 | 国产精品自在线拍国产 | 国产婷婷精品av在线 | 69国产盗摄一区二区三区五区 | 欧美国产精品一区二区 | 99视频网址 | 精品国产一区二区三区久久影院 | 91av原创| 又黄又爽免费视频 | 黄网站app在线观看免费视频 | 国产精品永久免费在线 | 丁香资源影视免费观看 | 日韩专区中文字幕 | 日本中文不卡 | 激情影院在线观看 | 在线观看岛国av | 国产精品大全 | 少妇bbbb揉bbbb日本 | 激情深爱| 亚洲一区动漫 | 毛片二区 | 成人毛片一区 | 日日干av | 国产精品日韩在线播放 | 综合久久久久久久久 | 午夜精品久久久久99热app | 成人在线视频你懂的 | 在线小视频你懂得 | 欧美激情va永久在线播放 | 在线播放视频一区 | 丁香视频在线观看 | 91在线播 | 国产中文字幕网 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 亚洲精品综合久久 | 日韩高清不卡在线 | 亚洲在线a | 五月天中文字幕mv在线 | 久精品视频在线 | 97视频在线观看视频免费视频 | 深夜免费福利在线 | 欧美日韩国产在线 | 亚洲成人中文在线 | 五月天久久综合 | 国产一级精品视频 | 国产成人免费高清 | 99re亚洲国产精品 | 日本少妇久久久 | 亚洲成人精品在线 | 四虎成人精品永久免费av九九 | 麻豆观看 | 久久99国产综合精品免费 | 久久国产精彩视频 | a级片久久| 99久久999久久久精玫瑰 | 久久99国产精品久久99 | 日韩a在线观看 | 国产精品一区二区久久精品爱微奶 | 激情婷婷综合网 | 九九热视频在线免费观看 | 日韩理论电影在线观看 | 久久99久国产精品黄毛片入口 | 69xx视频 | 久久久久久久久久免费 | 97超视频在线观看 | 亚洲日本一区二区在线 | 欧美一级久久 | 国产高清在线永久 | 欧美a免费 | 91传媒在线观看 | 亚洲精品在线免费 | 91在线视频观看免费 | 久久视频在线观看免费 | 在线免费观看一区二区三区 | 99国产精品一区二区 | 婷婷在线视频 | 亚洲视频456 | 超级碰视频 | 日韩在线免费电影 | 国产黄色片久久 | 亚洲精品国精品久久99热一 | 欧美一二三区在线观看 | 成人av高清 | 黄色的视频网站 | 国产成人一二片 | 国产中文字幕第一页 | 亚洲欧美视频一区二区三区 | 99国产精品一区二区 | 亚洲精品美女免费 | 欧美性极品xxxx做受 | 西西44人体做爰大胆视频 | 国产美腿白丝袜足在线av | 日韩av黄 | 西西www4444大胆视频 | 国产精品6 | 在线国产不卡 | 激情视频免费在线观看 | 色成人亚洲 | av一区二区在线观看中文字幕 | 久久视频这里只有精品 | 91免费高清观看 | 国产一级片免费观看 | 久久er99热精品一区二区三区 | 97夜夜澡人人双人人人喊 | 久久精品久久国产 | 免费激情在线电影 | 在线视频 91| 欧美二区在线播放 | 日韩精品一区二区在线 | 最新av网址大全 | 精品一区二区在线免费观看 | 97在线精品国自产拍中文 | 日韩在线在线 | 黄色a视频免费 | 久久亚洲私人国产精品va | 特及黄色片 | av在线h| 欧美福利在线播放 | 日韩国产欧美在线视频 | 国产综合小视频 | 公开超碰在线 | 亚洲色图美腿丝袜 | av成年人电影 | 免费观看的黄色 | 蜜臀久久99精品久久久酒店新书 | 欧美精品久久久久久久免费 | 免费高清在线观看电视网站 | 免费观看一区二区 | 国产伦精品一区二区三区在线 | 日韩中文字幕视频在线 | 小草av在线播放 | 五月婷婷综合激情网 | 中文字幕资源在线 | 一区二区三区四区五区在线视频 | 天天躁天天操 | 午夜影院一级片 | 九九热只有精品 | 亚洲欧美乱综合图片区小说区 | aav在线| 久久情侣偷拍 | 欧美在线视频一区二区三区 | 国产手机视频在线播放 | 激情婷婷丁香 | 国产精品伦一区二区三区视频 | 又黄又刺激 | 一区二区精品国产 | 久久成熟 | 亚洲视频精选 | 日韩黄色免费在线观看 | 色婷婷88av视频一二三区 | aaa日本高清在线播放免费观看 | 99久视频 | 免费观看黄色av | a视频免费看 | 久久久www成人免费毛片麻豆 | 四虎在线观看精品视频 | 欧美一级片在线播放 | 久青草影院 | 中文字幕乱偷在线 | 日韩精品国产一区 | 久久免费视频在线观看 | av一区二区三区在线观看 | 国产精品高清av | 欧美在线日韩在线 | 99色人 | 人人干网 | 欧美analxxxx| 91桃色在线免费观看 | 日本中文字幕在线一区 | 丁香花在线视频观看免费 | 国产三级国产精品国产专区50 | 国产成人精品久久亚洲高清不卡 | 在线 成人 | 91高清免费 | 国产一区在线视频 | 久草在线免费新视频 | 欧洲一区二区三区精品 | 97成人精品视频在线观看 | 狠狠地操 | 国产综合小视频 | 国产精品久久片 | 男女激情麻豆 | 日韩有码第一页 | 国产精品6999成人免费视频 | 亚洲欧美视频一区二区三区 | 不卡的av在线 | 亚洲精品久久视频 | 欧美一区二区三区免费看 | 欧美坐爱视频 | 国产午夜在线观看视频 | 久久久综合色 | 中文字幕一区二区三区精华液 | 九九九热 | 日韩91在线 | www色av| 国产精品久久久久影院日本 | 黄色在线成人 | 精品国产免费看 | 国产午夜精品视频 | 日韩精品无 | 精品国产伦一区二区三区观看说明 | 欧美va天堂va视频va在线 | 奇人奇案qvod | 美女视频网站久久 | 97国产在线 | 视频99爱| 精品一区二区在线免费观看 | 国产成人精品在线 | 国产成人精品av在线观 | 久久久久久久久久久久久久av | 久久专区| 中文国产在线观看 | 成年人app网址 | 日韩欧美国产激情在线播放 | 国产亚洲欧美在线视频 | 激情开心站 | 成人欧美一区二区三区黑人麻豆 | 手机av观看 | 日韩精品一区二区三区三炮视频 | 欧美精品在线观看一区 | 色网站在线 | 国产成人av电影在线观看 | 亚洲日本精品视频 | 99在线观看视频网站 | 欧美伦理一区二区 | 久久久91精品国产一区二区三区 | 精品国产精品久久一区免费式 | 免费观看丰满少妇做爰 | 久久免费精品一区二区三区 | 国产夫妻性生活自拍 | 依人成人综合网 | 免费在线播放av电影 | 日日干激情五月 | av成人在线观看 | 久久视频 | 亚洲精选视频在线 | 最新av在线网站 | 九色琪琪久久综合网天天 | 久久精品美女视频网站 | 99这里只有精品视频 | 久久婷婷国产色一区二区三区 | 国产手机在线播放 | 日韩精品中文字幕一区二区 | 欧美精品三级在线观看 | 国外成人在线视频网站 | 99爱国产精品 | 亚洲国产精品成人av | 中文字幕资源网 | 久久综合久久久久88 | 91综合视频在线观看 | 手机av电影在线 | 日韩免费一区二区 | 最近中文字幕在线播放 | 国产亚洲va综合人人澡精品 | 五月婷婷久久综合 | 粉嫩aⅴ一区二区三区 | 五月婷婷国产 | 91av在| 亚洲成人资源在线 | 久久99精品国产99久久 | 超碰免费在线公开 | 国产精品一区久久久久 | 麻豆视频免费网站 | 欧美日韩高清 | 最新精品视频在线 | 9i看片成人免费看片 | 91视频免费播放 | 天天色播 | 婷婷在线免费观看 | 亚洲成人精品在线观看 | 在线免费高清视频 | 久久99久久99精品免视看婷婷 | 色www精品视频在线观看 | a级片韩国 | 中文字幕在线国产 | 亚洲精品日韩在线观看 | 五月婷婷精品 | 亚洲电影av在线 | 国产成人一区二区精品非洲 | 欧美激情精品久久久久 | 精品嫩模福利一区二区蜜臀 | www.大网伊人 | 蜜桃麻豆www久久囤产精品 | 久久影院精品 | 中文字幕一区二区三区四区久久 | 欧美视频在线观看免费网址 | 色噜噜狠狠色综合中国 | 日韩狠狠操 | 国产亚洲视频中文字幕视频 | 国产黄在线看 | 2021久久| 激情导航 | 欧美亚洲成人免费 | 成人av免费播放 | 91高清不卡| www亚洲精品| 国产黄大片在线观看 | 69亚洲视频| 91秒拍国产福利一区 | 国产免费又粗又猛又爽 | 色多视频在线观看 | 日韩精品在线视频 | 国产剧情一区二区在线观看 | 国产破处在线播放 | 免费精品 | 又爽又黄又无遮挡网站动态图 | 九九热只有这里有精品 | 欧美男男激情videos | 激情久久久久 | 精品成人国产 | 久久艹艹 | 97av超碰| 久久久人人爽 | 免费无遮挡动漫网站 | 黄色软件在线观看视频 | 日韩色爱 | 51久久成人国产精品麻豆 | 黄色.com | 在线观看国产一区二区 | 精品国产一二三 | 精品色999| 91精品人成在线观看 | 日日操夜| 日韩中文久久 | 亚洲国产丝袜在线观看 | 婷婷六月天综合 | 国产无吗一区二区三区在线欢 | 99精品视频免费看 | 久草在线视频网站 | 99久久99视频| 色偷偷88888欧美精品久久久 | 色七七亚洲影院 | 波多野结依在线观看 | 国产精品久一 | 天天干夜夜爽 | 亚洲免费a| 五月婷婷激情综合网 | 欧美经典久久 | 黄色av网站在线免费观看 | 国产精品麻豆99久久久久久 | 国产色视频一区二区三区qq号 | 狠狠色丁香婷婷综合最新地址 | 成人免费视频在线观看 | 高潮久久久久久久久 | 国产成人a亚洲精品 | 最新中文字幕在线资源 | 伊人影院在线观看 | 亚洲免费av片 | 日韩中文字幕在线看 | 久久精国产 | 五月天综合在线 | 国产日韩欧美在线一区 | 国产黄色理论片 | 久久人操 | 免费在线观看的av网站 | 国产精品嫩草影视久久久 | 久久精品2 | 五月婷婷中文字幕 | 久久综合婷婷国产二区高清 | 黄色精品一区 | 黄色一级在线免费观看 | 91成人免费看 | 国产午夜在线观看视频 | 99re6热在线精品视频 | 国内揄拍国产精品 | 成人在线视频观看 | 99精品视频免费观看视频 | 少妇bbbb揉bbbb日本 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 日韩av片免费在线观看 | 免费在线激情电影 | 日本久久片 | 最新av免费在线观看 | 天海翼一区二区三区免费 | 欧美日韩一区二区三区在线免费观看 | 九九久久影院 | 亚洲伦理一区 | 国产精品99久久99久久久二8 | 精品国产一区二区三区四 | 九九热精品视频在线观看 | 欧美日韩有码 | 日日日日干 | 日韩免费一级a毛片在线播放一级 | 久久不射电影院 | 久久99国产精品自在自在app | av资源网在线播放 | 婷婷六月综合网 | 五月天堂色 | 亚洲欧洲视频 | 高清不卡毛片 | 9999毛片| 国产成人久 | 亚洲2019精品| 亚洲国产精品久久久 | 久久a热6| 国产亚洲精品成人av久久ww | 久久精品国产成人精品 | 欧美韩日视频 | 日韩影片在线观看 | 97国产精品亚洲精品 | 天天射天天干天天爽 | 午夜精品区 | 97热久久免费频精品99 | 五月天天色 | 成人在线免费观看网站 | 激情视频免费在线观看 | 激情五月婷婷激情 | 日日爽天天 | 97超碰在线免费观看 | 久久人人精 | 国产一区免费视频 | 日韩字幕 | 亚洲天堂网站视频 | 天天看天天干天天操 | 亚洲 中文字幕av | 国产精品欧美激情在线观看 | 欧美韩国日本在线观看 | 中文字幕精品一区 | 视频在线观看一区 | 91视频成人免费 | 97碰碰精品嫩模在线播放 | 91桃色视频| 亚洲国产三级 | 日韩精品一卡 | 国产精品久久久久久一区二区三区 | 久草网视频在线观看 | 精品久久久久久久久久久院品网 | a√天堂中文在线 | 日日激情 | 欧美亚洲久久 | 香蕉视频导航 | 狠狠干天天操 | 亚洲视频免费视频 | 国产999精品久久久久久麻豆 | 亚洲精品乱码久久久久久9色 | 99精品在线直播 | 国产高清在线看 | 天天综合网天天 | 狠狠色伊人亚洲综合网站色 | 亚洲一区精品二人人爽久久 | 懂色av一区二区在线播放 | www免费看 | 日女人免费视频 | 国产高清绿奴videos | 国产精品免费看久久久8精臀av | 丝袜+亚洲+另类+欧美+变态 | 亚州欧美视频 | 亚洲成人网在线 | 久久国产精品色av免费看 | 99精品国产99久久久久久福利 | 欧美一区二区三区在线播放 | 99精品在线直播 | 色噜噜狠狠狠狠色综合 | 日韩免费一区 | 视频二区在线 | 狠狠狠色丁香婷婷综合久久88 | 亚洲黄电影 | 日日夜夜操操操操 | 色视频网站在线 | 香蕉网站在线观看 | 狠狠色丁香婷婷综合欧美 | www五月天com| 久久伊99综合婷婷久久伊 | av免费电影在线观看 | 狠狠色香婷婷久久亚洲精品 | 久久久午夜精品理论片中文字幕 | 国产96在线 | 久久成人久久 | 国内精品久久久久久久影视麻豆 | 国产精品不卡在线播放 | 国产丝袜 | 成年人在线免费看 | 国产资源在线免费观看 | 在线之家免费在线观看电影 | 国产精品字幕 | 黄色av一区二区三区 | 正在播放一区二区 | 日韩一二区在线观看 | 国产精品欧美一区二区 | 午夜精品99久久免费 | 久久视频一区二区 | 欧美精品被 | 成人性生交大片免费观看网站 | 99热这里只有精品在线观看 | 免费日韩一区 | 国产精品久久久电影 | 国产精品日韩欧美 | 国产一区在线视频播放 | 在线日本看片免费人成视久网 | 在线精品视频免费观看 | 狠狠操.com | 国产精品va在线观看入 | www.天天干 | 日本黄区免费视频观看 | 久久综合久久综合久久 | 人人插人人| 国产剧情一区二区在线观看 | 高清不卡免费视频 | 国产精品一区二区在线免费观看 | 日韩视频免费播放 | 精品 激情 | 精品女同一区二区三区在线观看 | 91在线观看欧美日韩 | 99热最新在线 | 国产一区二区在线免费播放 | 国产高清中文字幕 | 91免费观看网站 | 在线国产视频 | 狠狠躁日日躁狂躁夜夜躁 | 国产精品免费一区二区三区 | 国产成人精品一区二三区 | 免费三级大片 | 九月婷婷色 | 国产精品久久久av | 久草免费在线观看 | 亚洲国产精品传媒在线观看 | 97超级碰碰碰碰久久久久 | 黄网站app在线观看免费视频 | 2021国产在线 | 97国产精品| 国产在线精品观看 | 国产精品不卡在线播放 | 男女免费视频观看 | 久香蕉| 美女久久久久久久久久久 | 国产麻豆果冻传媒在线观看 | 男女精品久久 | 91精选在线观看 | 亚洲高清视频一区二区三区 | 一本一本久久a久久精品综合小说 | av电影在线播放 | 97电影院网| av在线电影播放 | 97精品国产97久久久久久粉红 | 五月婷网 | 天天干天天操天天入 | 日韩av高清在线观看 | 成人网444ppp | 91精品一 | 亚洲国产精品久久久久久 | 日本久久久久久久久 | 91麻豆国产福利在线观看 | 日韩在线观看影院 | 国产日韩欧美视频 | 亚洲综合欧美激情 | 国产一区在线播放 | 午夜黄色大片 | 色婷婷激婷婷情综天天 | 国产精品久久三 | 亚洲黄a| 日韩成人高清在线 | 福利av在线| 久久久精品| 91精品视频一区二区三区 | 在线播放国产一区二区三区 | 91自拍视频在线 | 久久久久97国产 | 中文字幕在线播放日韩 | 精品亚洲欧美一区 | 99久久精品免费看国产 | 青青河边草免费视频 | 日韩黄色一级电影 | 久久网站免费 | 一本色道久久精品 | 中文字幕成人网 | 成片免费观看视频 | 欧美日本高清视频 | 中文字幕中文字幕在线中文字幕三区 | 亚洲影视九九影院在线观看 | 一级黄色片在线观看 | av一级在线| 久草视频在线免费 | 亚洲美女在线一区 | 婷久久| 97国产大学生情侣酒店的特点 | 97理论片| 亚洲精品高清一区二区三区四区 | 国产一线天在线观看 | 日本性生活一级片 | 亚洲日本欧美 | 黄p在线播放 | 丝袜av一区| 亚洲成人xxx| 色综合久久久 | 久久手机视频 | 日本久久免费电影 | 99久久日韩精品免费热麻豆美女 | 亚洲天堂网站视频 | 深夜国产福利 | 亚洲国产日韩一区 | 欧美一区二区在线看 | 亚洲日本va在线观看 | 欧美日韩另类在线观看 | 国内精品视频久久 | 一区中文字幕 | 91av视频在线播放 | 国产96在线观看 | 亚洲日本成人 | 男女激情网址 | 九九色视频 | 精品久久久免费 | 久久综合九色欧美综合狠狠 | 在线观看中文字幕av | 久久久久激情 | 日韩视频二区 | 亚洲第一中文网 | 99久久精品免费看国产四区 | a视频免费看 | 国产精品欧美 | 色婷婷婷 | 五月天.com | 国产四虎影院 | 亚洲成av人电影 | 日韩一区正在播放 | 亚洲国产欧美在线人成大黄瓜 | 超碰在97 | 国产伦理久久精品久久久久_ | www.色爱 | 99这里都是精品 | av日韩av| 久久少妇免费视频 | 欧美性大战 | 国产精品a久久 | 久久久久久久久久久网站 | 99视频久久 | 开心激情五月网 | 国产精品午夜免费福利视频 | 欧美日韩xx | 欧美韩国日本在线 | 中文字幕专区高清在线观看 | 久久伦理| 亚洲精品99 | 中文在线a∨在线 | 热99久久精品 | 亚洲国产美女精品久久久久∴ | 99视频在线精品国自产拍免费观看 | 韩国三级av在线 | 插婷婷| 国产成人黄色片 | 毛片网在线 | 激情文学丁香 | av一区二区三区在线 | 久久久久久网站 | 91精品啪在线观看国产81旧版 | 97高清视频 | 草久电影 | 99久久精品国 | www.久久色.com| 午夜免费电影院 | 激情综合色综合久久综合 | 中文字幕在线观看完整版 | 成人免费观看视频网站 | 91视频在线免费看 | 狠日日 | 99久久精品国产系列 | 免费看色的网站 | 国产成人一区二区三区久久精品 | 国内毛片毛片 | 色婷婷一区 | 久久久精品国产一区二区三区 | 91高清视频在线 | 成人在线网站观看 | 色先锋av资源中文字幕 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 免费观看全黄做爰大片国产 | 91精品综合在线观看 | 91亚洲网| 手机av电影在线 | 久久视频免费在线 | 久久久久综合精品福利啪啪 | 久久久网站| 91成人免费在线视频 | 国产日韩精品一区二区三区 | 四虎免费av | 国产偷在线 | 久久久久久毛片精品免费不卡 | 在线免费中文字幕 | 国产一区二区在线精品 | 国产又黄又爽无遮挡 | 欧美孕交vivoestv另类 | 日韩在线国产精品 | 在线免费观看视频 | 九九九九精品九九九九 | 午夜视频播放 | 2023亚洲精品国偷拍自产在线 | 久久精品123| 久草视频99 | 色婷婷狠狠 | 欧美日韩国产综合网 | 91精品专区 | 成年人黄色免费网站 | 91色国产在线 | 日韩色爱| 色网址99 | 午夜12点 | 视频 天天草 | 三级黄色在线观看 | 美女网站一区 | 亚洲乱码精品久久久久 | 丁香导航 | 日本最新一区二区三区 | 午夜精品电影一区二区在线 | 国产免费二区 | 操操综合网 | www.成人sex| 五月天激情开心 | 日韩高清免费电影 | 深夜国产福利 | 久久精品亚洲一区二区三区观看模式 | 亚洲国产欧美一区二区三区丁香婷 | 日韩在线电影一区二区 | 国产分类视频 | 欧美一级片免费在线观看 | 久久欧美精品 | 国产打女人屁股调教97 | 日韩3区 | 精品亚洲午夜久久久久91 | 97在线看 | 欧美日韩性视频在线 | 91亚洲精品国偷拍 | 在线视频日韩一区 | 午夜视频在线观看一区二区三区 | 欧美日韩高清一区 | 成人av电影免费观看 | 亚洲欧美视频网站 | 午夜精品视频一区二区三区在线看 | 欧美日韩在线观看不卡 | 亚洲综合色视频 | 久久免费公开视频 | 97人人添人澡人人爽超碰动图 | 日本久久综合网 | 欧美日韩久久一区 | 91成人网在线 | 欧美一区二区在线 | 天天干天天摸天天操 | 黄色av一级片 | 麻豆久久 | 黄色网www | 久久超碰97 | 日韩一级电影在线观看 | 精品女同一区二区三区在线观看 | www麻豆视频| 欧美日韩亚洲一 | 免费毛片aaaaaa | 麻豆视频在线免费观看 | 亚洲视频综合 | 91精品视频免费 | 99精品视频在线播放观看 | 午夜国产福利在线观看 | 国产精品一区二区久久精品爱微奶 | 欧美色图亚洲图片 | 欧美精品免费一区二区 | 久久久久免费精品国产小说色大师 | 黄网站免费大全入口 | 韩国av不卡 | 97高清视频 | 免费国产在线观看 | 成人免费在线电影 | 啪啪免费试看 | 天天操福利视频 | 日韩精品1区2区 | 亚洲精品成人免费 | 亚洲成人黄色在线 | 婷婷综合视频 | 国产精品日韩 | 性日韩欧美在线视频 | 欧美日韩国产区 | 成 人 黄 色视频免费播放 | 精品人人人 | av在线成人 | 国产剧情一区二区 | 97超碰在线资源 | 天堂va欧美va亚洲va老司机 | 九九久| 99在线精品视频 | 国产精品久久久久久久久岛 | 成人a视频 | 久久亚洲国产精品 | 色婷婷久久久综合中文字幕 | 成人国产网址 | 欧美激情奇米色 | 亚洲国产网站 | 日日爽夜夜操 | av激情五月 | 黄色毛片视频 | 日韩av看片| 96久久欧美麻豆网站 | 手机看片国产日韩 | 国产视频不卡一区 | 久草视频在线资源站 | 亚洲天堂网视频 | 久久免费电影网 | 国产美女免费观看 | 成人久久久精品国产乱码一区二区 | 顶级bbw搡bbbb搡bbbb| 亚洲视频一级 | 国产精品久久视频 | 五月婷婷伊人网 | 五月天婷婷在线视频 | 高清av免费看 | 色婷婷在线视频 | 精品国产一区二区三区久久久 | 黄色的网站免费看 | 欧美视频18 | 久久99在线 | 不卡日韩av | 天天干 夜夜操 | 三上悠亚一区二区在线观看 | 三上悠亚在线免费 | 成人午夜在线观看 | 97狠狠干| 国产涩涩网站 | 国产美女精品视频免费观看 | 久久天天躁狠狠躁夜夜不卡公司 | 又黄又刺激视频 | 精品国偷自产国产一区 | 国产精品一区久久久久 | 国产成人a亚洲精品 | 久久综合五月天 | 中文字幕一区二区三区四区 | 欧美极品少妇xxxx | 亚洲高清视频在线播放 | 国产在线精品一区二区 | 色婷婷狠狠五月综合天色拍 | 色综合天天射 | 免费亚洲精品视频 | 国产免费久久av | 国产资源在线免费观看 | 欧美精品一区二区三区四区在线 | 日韩中文字幕亚洲一区二区va在线 | 丁香网婷婷 | 日本中文字幕观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久久免费高清 | 男女视频久久久 | 激情婷婷欧美 | 激情av综合 | 最新av在线播放 | 久碰视频在线观看 | 国产免费av一区二区三区 | 成人黄色免费在线观看 | 91热视频| 91精品1区2区 | 免费三及片 | 国产精品99久久久久久宅男 | 婷婷色资源 | 色爽网站 | 国产日产高清dvd碟片 | 色99之美女主播在线视频 | 99爱视频在线观看 | 香蕉视频啪啪 | 天天拍天天干 | 一级黄色电影网站 | 国产精品欧美久久久久天天影视 | 国产手机视频在线 | 9999精品视频 | 九九热只有这里有精品 | 国产亚洲欧洲 | 久久婷婷激情 | 久久精品爱爱视频 | 1区2区视频 | 久久亚洲视频 | 亚洲成人xxx | 久久在线免费 | 一区二区三区观看 | 免费看黄的视频 | 亚洲 欧美 变态 国产 另类 |