将我的代码的一些冗余部分进行了删减。要正常运行该代码,首先需要pip本代码使用的库,或者直接下载anaconda的环境;其次主菜单启动图片的加载是载入记录在另一个py文件中的图片的base64编码的,若直接复制代码运行会出错,若要运行请将‘from memory_pic import *’删除,将get_pic函数删除并修改‘a=random.randint(1,3)
name="bizhi"+str(a)+'_gif'
filename="bizhi"+str(a)+'.gif'
get_pic(eval(name), filename)
photo = tk.PhotoImage(file=filename)’换成您的图片的绝对地址(只能是gif图片),

软件主界面

软件主界面
画图软件运行后会出现该主界面。主界面的左上角是三枚菜单按键,其中设置菜单键,可设置画布的快捷键(该功能正在开发中);单击帮助键,软件将打开浏览器跳转到该使用指南。

画图键

将鼠标移至画图键,出现下拉菜单,保存按键功能正在开发中。单击新画板,来新建画布。
画图键菜单
单击新画板后系统出现弹窗。
画布设置弹窗
在画布长度一栏中输入整数,设置画布x轴长度;同理在画布高度一栏中输入整数,设置画布y轴长度。该项数据默认为(1920,1080)
单击选择画布颜色键选择画布的背景颜色,此时系统会弹出系统默认的颜色选择框。若不进行选择,系统默认画布颜色为黑色。
颜色选择框
点击画布设置框中的新建画布即可创建画布

画布界面

画布界面
画布界面分为两个部分:浮动的工具栏和画布主体。
** 须知工具栏总在窗口的最前端,且一但关闭只能重新新建画布 **

工具栏

常规工具

对于画笔、矩形、椭圆(圆)、橡皮擦、直线、箭头直线工具,使用方法类似。在画布窗口点击鼠标左键并且不抬起,在画布窗口中滑动进行绘画,抬起鼠标左键绘画终止。

新建文本

单击新建文本后,弹出对话框,输入想打印的文本,单击确认。
输入文本
后在画布界面,您想要插入文本的地方单击一次,并在画布的另一个位置单击另一次,插入文本的大小将根据两次单击的x轴距离进行相应计算,插入文本的中心与两次单击的连线中点的位置重合。

插入图片

文件选择对话框
单击插入图片,弹出系统文件选择框,支持高达4种的图片文件格式,选择图片文件后,系统弹出对话框
图片比例
选择想要的图片比例后,单击插入图片后在画布上单击,单击位置即为图片插入的中心位置。

颜色

单击颜色文件选择颜色,该选项可以控制画笔、矩形、椭圆(圆)、直线、箭头直线、新建文本以及填充的颜色。默认画笔颜色为黄色。

清屏

删除画布上一切内容

右侧粗细选择滑动条

该选项可以控制画笔、矩形、椭圆(圆)、直线、橡皮擦、箭头直线的粗细。系统默认值为5。

选择

单击选择按钮后,单击鼠标左键并且拖动,进行框选,框选完成后松开鼠标左键,按住鼠标右键进行拖动改变选中内容的位置。

填充

在画板上有用**画笔**工具**一笔画出**的**闭合曲线**时,点击填充,在待填充曲线的内部,单击鼠标左键并等待,在填充颜色出现前不要移动鼠标。
注意:在填充前缩放画布可能会导致未知bug;在填充后,选择并移动被填充部位或者是缩放画布可能会异常卡顿

常用快捷键&其他操作

缩放画布

鼠标滚轮滚动

撤销操作

键盘快捷键:CTRL+Z

平移画布

在画布下侧和右侧分别有滚动条,当放大画布时,滚动条会出现滑块,此时可以进行画布的平移。

画笔颜色快捷键

键盘按键:r 转换画笔颜色为红色。
键盘按键:g 转换画笔颜色为绿色。
键盘按键:b 转换画笔颜色为蓝色。
键盘按键:y 转换画笔颜色为黄色。

import tkinter as tk
from tkinter import messagebox
from tkinter.colorchooser import askcolor
from tkinter import *
import random
from memory_pic import *
from base64 import * 
import ctypes
import tkinter.filedialog
from tkinter.ttk import *
from os.path import exists
import PIL.Image
import os, sys
import numpy as np
import math
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

import webbrowser
#创建窗口,root可替换成自己定义的窗口
sys.setrecursionlimit(1000000) #重新设置栈空间
root = tk.Tk()
#调用api设置成由应用程序缩放
ctypes.windll.shcore.SetProcessDpiAwareness(1)
#调用api获得当前的缩放因子
ScaleFactor=ctypes.windll.shcore.GetScaleFactorForDevice(0)
#设置缩放因子
root.tk.call('tk', 'scaling', ScaleFactor/75)

col_1=(0,'#000000')
width_b=0
height_b=0
global i #对于插入文本功能的全局计数器
i=0

win_width = 1000* ScaleFactor/100
win_height = 500 * ScaleFactor/100

class Application(Frame):
    """一个经典的GUI写法"""

    def __init__(self, master=None):
        """初始化方法"""
        super().__init__(master)  # 调用父类的初始化方法
        self.x = 0
        self.y = 0
        self.fgcolor = 'yellow'
        self.lastdraw = 0
        self.start_flag = False
        self.master = master
        self.pack()
        self.createWidget()
        self.Tbar()
        self.start_flag_text= True
        self.thickness=5
        self.stlist=[]
        self.w=None
        self.start_flag_pic=True
        self.start_fill=True
        self.coordsrect=[]
        self.chosenlist=[]
        self.j=0
        self.penmarklist=[]
        self.pencount=0
        self.pencountflag=False

    def createWidget(self):
        """创建画图区域"""
        self.drawpad = tk.Canvas(self, width=width_b, height=height_b, bg=col_1[1])
        self.drawpad.grid()
        self.drawpad.bind('<ButtonRelease-1>', self.stopDraw)  
        
        # 创建按钮
        self.xsb = tk.Scrollbar(self, orient="horizontal", command=self.drawpad.xview)
        self.ysb = tk.Scrollbar(self, orient="vertical", command=self.drawpad.yview)
        self.drawpad.configure(yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set)
        self.drawpad.configure(scrollregion=(0,0,1000,1000))
        # draw
        
        self.layout()
        # This is what enables scrolling with the mouse:
        self.drawpad.bind("<ButtonPress-1>", self.scroll_start)
        self.drawpad.bind("<B1-Motion>", self.scroll_move)
        self.drawpad.bind("<B3-Motion>", self.movethechosen)
        #windows scroll
        self.drawpad.bind("<MouseWheel>",self.zoomer)
    
    def tocanvasxy(self, event):
        return int(self.drawpad.canvasx(event.x)), int(self.drawpad.canvasy(event.y))
        
    def scroll_start(self, event):
        x, y = self.tocanvasxy(event)
        self.drawpad.scan_mark(x, y)

    def scroll_move(self, event):
        x, y = self.tocanvasxy(event)
        self.drawpad.scan_dragto(x, y, gain=1)
        

    def zoomer(self, event):
        x, y = self.tocanvasxy(event)
        if (event.delta > 0):
            self.drawpad.scale("all", x, y, 1.1, 1.1)
        elif (event.delta < 0):
            self.drawpad.scale("all", x, y, 0.9, 0.9)
        self.drawpad.configure(scrollregion = self.drawpad.bbox("all"))
    
    
    def layout(self):
        self.xsb.grid(row=1, column=0, sticky="ew")
        self.ysb.grid(row=0, column=1, sticky="ns")
        self.drawpad.grid(row=0, column=0, sticky="nsew")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        
    def scroll_start(self, event):
        self.drawpad.scan_mark(event.x, event.y)

    def scroll_move(self, event):
        self.drawpad.scan_dragto(event.x, event.y, gain=1)
    
    
    
    def cancel_1(self):
        self.quest_1.destroy()    
    def cancel_2(self):
        self.quest_2.destroy()  
    #创建悬浮工具窗
    def confirm_1(self):
        
        self.text = self.text_w.get()
        self.start_flag_text= True            
        
        self.quest_1.destroy()
        #画板外框宽
    def confirm_2(self):
        
        
                  
        
        self.quest_2.destroy()    
        self.start_flag_pic=True
    def Tbar(self):
        def thicknessslider(v):
            self.thickness = v
        self.tbar=tk.Tk()
        
        
        self.menubar=Frame(self.tbar)
        #self.tbar.overrideredirect(True)
        self.tbar.attributes("-topmost", True)
        self.tbar.attributes("-toolwindow", 1)
        self.menubar.pack()
        
        self.slider = tk.Scale(self.tbar, label='粗细', from_=0, to=100, orient=tk.VERTICAL, length=500, showvalue=1,tickinterval=2, resolution=1, command=thicknessslider)
        self.slider.pack(side='right')

        self.btn_start = Button(self.tbar, name='start', text='开始')
        self.btn_start.pack(side='top', pady=10,ipadx=20)
        self.btn_pen = Button(self.tbar, name='pen', text='画笔')
        self.btn_pen.pack(side='top', pady=10,ipadx=20)
        self.btn_rect = Button(self.tbar, name='rect', text='矩形')
        self.btn_rect.pack(side='top', pady=10,ipadx=20)
        self.btn_oval = Button(self.tbar, name='oval', text='椭圆')
        self.btn_oval.pack(side='top', pady=10,ipadx=20)
        self.btn_circle = Button(self.tbar, name='circle', text='圆')
        self.btn_circle.pack(side='top', pady=10,ipadx=20)
        self.btn_clear = Button(self.tbar, name='clear', text='清屏')
        self.btn_clear.pack(side='top', pady=10,ipadx=20)
        self.btn_erasor = Button(self.tbar, name='erasor', text='橡皮擦')
        self.btn_erasor.pack(side='top', pady=10,ipadx=20)
        self.btn_line = Button(self.tbar, name='line', text='直线')
        self.btn_line.pack(side='top', pady=10,ipadx=20)
        self.btn_line_arrow = Button(self.tbar, name='line_arrow', text='箭头直线')
        self.btn_line_arrow.pack(side='top', pady=10,ipadx=20)
        self.btn_color = Button(self.tbar, name='color', text='颜色')
        self.btn_color.pack(side='top', pady=10,ipadx=20)
        self.btn_text=Button(self.tbar,name='text',text='新建文本')
        self.btn_text.pack(side='top',pady=10,ipadx=20)
        self.btn_pic=Button(self.tbar,name='pic',text='插入图片')
        self.btn_pic.pack(side='top',pady=10,ipadx=20)
        self.btn_cho=Button(self.tbar,name='choose',text='选择')
        self.btn_cho.pack(side='top',pady=10,ipadx=20)
        self.btn_fill=Button(self.tbar,name='fill',text='填充')
        self.btn_fill.pack(side='top',pady=10,ipadx=20)
        # 绑定事件
        self.btn_line.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_line_arrow.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_rect.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_oval.bind('<Button-1>', self.eventManager)
        self.btn_circle.bind('<Button-1>', self.eventManager)
        self.btn_pen.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_erasor.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_clear.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_color.bind('<Button-1>', self.eventManager)  # 点击按钮事件
        self.btn_cho.bind('<Button-1>', self.eventManager)
        self.btn_fill.bind('<Button-1>', self.eventManager)
        self.master.bind('<KeyPress-r>', self.hotKey)  # 绑定快捷键
        self.master.bind('<KeyPress-g>', self.hotKey)  # 绑定快捷键
        self.master.bind('<KeyPress-b>', self.hotKey)  # 绑定快捷键
        self.master.bind('<KeyPress-y>', self.hotKey)  # 绑定快捷键
        self.master.bind('<Control-z>', self.callback)
        self.btn_text.bind('<Button-1>',self.eventManager)
        self.btn_pic.bind('<Button-1>',self.eventManager)
        # 左键释放按钮
    
    
        
    
    def eventManager(self, event):
        name = event.widget.winfo_name()
        print(name)
        self.start_flag = True
        if name == 'line':
            # 左键拖动
            self.drawpad.bind('<B1-Motion>', self.myline)
            self.pencountflag=False
        elif name == 'line_arrow':
            self.drawpad.bind('<B1-Motion>', self.myline_arrow)
            self.pencountflag=False
        elif name == 'rect':
            self.drawpad.bind('<B1-Motion>', self.myrect)
            self.pencountflag=False
        elif name == 'oval':
            self.drawpad.bind('<B1-Motion>', self.myoval)
            self.pencountflag=False
        elif name == 'circle':
            self.drawpad.bind('<B1-Motion>', self.mycircle)
            self.pencountflag=False
        elif name == 'pen':
            self.drawpad.bind('<B1-Motion>', self.mypen)
            self.pencountflag=True
        elif name == 'erasor':
            self.drawpad.bind('<B1-Motion>', self.myerasor)
            self.pencountflag=False
        elif name == 'clear':
            self.drawpad.delete('all')
            self.penmarklist=[]
            self.pencountflag=False
            self.pencount=0
        elif name == 'text':
            self.quest_1 = tk.Toplevel()
            self.quest_1.title('请输入文本')
            self.quest_1.geometry('300x150+800+500')
            self.text_w = tk.StringVar() 
            self.text_w.set('插入文本') 
            self.pencountflag=False
            #tk.Label(quest, text='画布长度 ').place(x=20, y=20) 
    
            self.entry_text = tk.Entry(self.quest_1, textvariable=self.text_w) 
                
            self.entry_text.place(x=10, y=20)
            self.confirm = tk.Button(self.quest_1, text='确认', command=self.confirm_1)
            self.confirm.place(x=100,y=70)
            self.cancel = tk.Button(self.quest_1, text='取消', command=self.cancel_1)
            self.cancel.place(x=200,y=70)
            self.drawpad.bind('<Button-1>', self.createtext) 
        elif name == 'pic':
            def rat(b):
                
                self.ratio=b
                
            self.fn=tkinter.filedialog.askopenfilename(title='选择一个图片', filetypes=[('bmp文件','.bmp'),('gif文件','.gif'),('jpg文件','.jpg'),('png文件','.png')])
            self.quest_2 = tk.Toplevel()
            self.quest_2.title("插入图片大小")
            self.quest_2.geometry('400x200+800+500')
            self.scalpic=tk.Scale(self.quest_2, label='图片比例', from_=0, to=1, orient=tk.HORIZONTAL, length=320, showvalue=1,tickinterval=2, resolution=0.01, command=rat)
            self.scalpic.pack(side="top") 
            self.file_path = self.fn
            confirm = tk.Button(self.quest_2, text='插入图片', command=self.confirm_2)
            confirm.place(x=50,y=130)
            cancel = tk.Button(self.quest_2, text='取消', command=self.cancel_2)
            cancel.place(x=200,y=130)
            self.drawpad.bind('<Button-1>', self.putpic)  
            self.pencountflag=False
        elif name == 'color':
            c = askcolor(color=self.fgcolor, title='请选择颜色')
            print(c)  # c的值 ((128.5, 255.99609375, 0.0), '#80ff00')
            self.fgcolor = c[1]
            self.pencountflag=False
        elif name=="choose":
            self.drawpad.bind('<B1-Motion>', self.choose_and_move)
            self.pencountflag=False
        elif  name=='fill':
            self.drawpad.bind('<Button-1>', self.floodfill)
            self.start_fill=True
            self.pencountflag=False
    def startDraw(self, event):
        self.drawpad.delete(self.lastdraw)
        self.coordsrect=[]
        self.x11=0
        self.y11=0

        self.j=0
        
        if self.start_flag:
            self.start_flag = False
            self.x = self.drawpad.canvasx(event.x)
            self.y = self.drawpad.canvasy(event.y)

    def stopDraw(self, event):
        self.start_flag = True
        self.lastdraw = 0
        if self.pencountflag:
            self.pencount=self.pencount+1
    def myline(self, event):
        self.startDraw(event)
        self.lastdraw = self.drawpad.create_line(self.x, self.y, self.drawpad.canvasx(event.x), self.drawpad.canvasy(event.y), fill=self.fgcolor,width=self.thickness)
        self.stack()
    def myline_arrow(self, event):
        self.startDraw(event)
        self.lastdraw = self.drawpad.create_line(self.x, self.y,  self.drawpad.canvasx(event.x),self.drawpad.canvasy(event.y), arrow=LAST, fill=self.fgcolor,width=self.thickness)
        self.stack()
    def myrect(self, event):
        #print('f')
        self.startDraw(event)
        self.lastdraw = self.drawpad.create_rectangle(self.x, self.y, self.drawpad.canvasx(event.x), self.drawpad.canvasy(event.y), outline=self.fgcolor,width=self.thickness)
        self.stack()
    def myoval(self, event):
        self.startDraw(event)
        self.lastdraw = self.drawpad.create_oval(self.x, self.y, self.drawpad.canvasx(event.x), self.drawpad.canvasy(event.y), outline=self.fgcolor,width=self.thickness)
        self.stack()
    def mycircle(self, event):
        self.startDraw(event)
        self.lastdraw = self.drawpad.create_oval(self.x, self.y, self.drawpad.canvasx(event.x), self.y+(self.drawpad.canvasx(event.x)-self.x), outline=self.fgcolor,width=self.thickness)
        self.stack()
    def mypen(self, event):
        self.startDraw(event)
        #print('self.x=', self.x, ',self.y=', self.y)
        
        self.w=self.drawpad.create_line(self.x, self.y, self.drawpad.canvasx(event.x), self.drawpad.canvasy(event.y), fill=self.fgcolor,capstyle="round",width=self.thickness)
        self.penonly=self.w
        self.x = self.drawpad.canvasx(event.x)
        self.y = self.drawpad.canvasy(event.y)
        self.stack()
        self.stack_pen()
    def myerasor(self, event):
        self.startDraw(event)
        self.w=self.drawpad.create_line(self.x, self.y, self.drawpad.canvasx(event.x), self.drawpad.canvasy(event.y), fill=col_1[1],width=self.thickness,capstyle="round")
        self.x = self.drawpad.canvasx(event.x)
        self.y = self.drawpad.canvasy(event.y)
        self.stack()
    def hotKey(self, event):
        c = event.char
        if c == 'r':
            self.fgcolor = 'red'
        elif c == 'g':
            self.fgcolor = 'green'
        elif c == 'b':
            self.fgcolor = 'blue'
        elif c == 'y':
            self.fgcolor = 'yellow'

    def createtext(self, event):
        
        if self.start_flag_text:
            
            self.startDraw(event)
            global i
            i=i+1
            print(i)
            
            if i%2==1:
                self.x1=self.x
                
                self.y1=self.y
               
            elif i%2==0:
                a=len(self.text)**(0.8)
                self.x2=self.x
                self.y2=self.y
                self.deltax=(self.x2-self.x1)**(0.9)
                self.deltay=self.y1-self.y2
                self.meanx=(self.x1+self.x2)/2
                self.meany=(self.y1+self.y2)/2
                self.size=round(self.deltax/a)
                self.w=self.drawpad.create_text(self.meanx,self.meany,text=self.text,fill=self.fgcolor,font=('Times', self.size, 'bold italic'))
                self.stack()
                self.start_flag_text=False 
    def putpic(self,event):
        if self.start_flag_pic:
            self.photo_o = PIL.Image.open(self.file_path)
            
            w=round(int(self.photo_o.width)*float(self.ratio))
            h=round(int(self.photo_o.height)*float(self.ratio))
            self.photo_o = self.photo_o.resize((w,h)) # 将图片大小转换为(width,height)200x300大小
            file_path_list=list(self.file_path)
            del file_path_list[-4:-1]
            self.fp="".join(file_path_list)+'.gif'
            print(self.fp)
            self.photo_o.save(self.fp)
            
            self.startDraw(event)
            self.x= self.drawpad.canvasx(event.x)
            self.y= self.drawpad.canvasy(event.y)
            print(self.x)
            global photo_1
            photo_1= tk.PhotoImage(file=self.fp)
            self.w=self.drawpad.create_image(self.x, self.y,image=photo_1)                   
            self.stack()
            self.start_flag_pic=False
    
       
    def choose_and_move(self,event):
        
        self.startDraw(event)
        self.lastdraw = self.drawpad.create_rectangle(self.x, self.y, self.drawpad.canvasx(event.x), self.drawpad.canvasy(event.y),dash=(3,5),outline='grey')
        self.coordsrect.append(self.drawpad.coords(self.lastdraw))
        print(self.coordsrect)
        coords_cho=self.coordsrect[-1]
        x1=coords_cho[0]
        y1=coords_cho[1]
        x2=coords_cho[2]
        y2=coords_cho[3]
            
        self.item_cho=self.drawpad.find_enclosed(x1, y1, x2, y2)
        self.stack_1()
    def movethechosen(self,event):
        for i in range(len(self.chosenlist)):
            self.drawpad.delete(self.chosenlist.pop(-1)) 
        if self.coordsrect:
            self.j=self.j+1
            if self.j%2==1:
                self.x11=self.drawpad.canvasx(event.x)
                self.y11=self.drawpad.canvasy(event.y) 
            else:
                a=len(self.item_cho)
                
                self.delx=(ScaleFactor/75)*(self.drawpad.canvasx(event.x)-self.x11)
                self.dely=(ScaleFactor/75)*(self.drawpad.canvasy(event.y)-self.y11)
                for i in range(a):
                
                    self.drawpad.move(self.item_cho[i-1],self.delx,self.dely)
                
        else:
            None
    def floodfill(self,event):
        
        self.startDraw(event)
        if self.start_fill:
            coord_pen=[]
            a=len(self.penmarklist)
            for k in range(a):
                coord_pen.append(self.drawpad.coords(self.penmarklist[k-1]))
            b=len(coord_pen)
            c=np.array(coord_pen)
            x=(c[:,0]+c[:,2])/2
            y=(c[:,1]+c[:,3])/2
            for i in range(b):
                x[i-1]=self.drawpad.canvasx(x[i-1])
                y[i-1]=self.drawpad.canvasy(y[i-1])
            self.xfill=self.drawpad.canvasx(event.x)
            self.yfill=self.drawpad.canvasy(event.y)
                 
            delx=x-self.xfill
            dely=y-self.yfill
            eps=10**(-8)
            x=np.array(x)
            y=np.array(y)
            
            
            xy=np.concatenate((x,y),axis=0)
            
            xy=xy.reshape(2,-1).T
            print(xy)
            x_avil=[]
            y_avil=[]
            center=[self.xfill,self.yfill]
            r_list=[]
            theta_list=[]
            for i in range(len(x)):
                x_1=xy[i-1,:]
                r=math.sqrt(math.pow(x_1[0]-center[0],2)+math.pow(x_1[1]-center[1],2))
                theta=math.atan2(x_1[1]-center[1],x_1[0]-center[0])/math.pi*180#转换为角度
                if theta<0:
                    theta=360+theta
                r_list.append(r)
                theta_list.append(theta)
            print(theta_list)
            theta_r=np.concatenate((theta_list,r_list),axis=0)
            theta_r=theta_r.reshape(2,-1).T
            print(theta_r)
       
            num_clusters = self.pencount
            estimator = KMeans(n_clusters=num_clusters)
            estimator.fit(xy)#聚类
            label_pred = estimator.labels_ #获取聚类标签
            centroids = estimator.cluster_centers_ #获取聚类中心
            inertia = estimator.inertia_ # 获
            print(centroids)
            
            print((centroids-np.array([self.xfill, self.yfill]))**2)
            
            a=np.argsort(np.sum((centroids-np.array([self.xfill ,self.yfill]).T)**2))
            
            num=a[0]
            
            for i in range(len(x)-1):
                if label_pred[i-1]==num:
                    x_avil.append(x[i-1])
                    y_avil.append(y[i-1])                    
            print(num)
            for i in range(len(x_avil)-1):
                for k in range(len(x_avil)-1):
                    self.w=self.drawpad.create_line(x_avil[i-1], y_avil[i-1], x_avil[k-1], y_avil[k-1] , fill=self.fgcolor,width=20)
                    self.stack()
            self.start_fill= False    
            
    def stack(self):     #对于撤回功能的栈
        if self.w == None: 
            self.stlist.append(self.lastdraw)
        else:
            self.stlist.append(self.lastdraw)
            self.stlist.append(self.w)
    def stack_1(self):    #对于撤回功能的栈
        if self.w == None: 
            self.chosenlist.append(self.lastdraw)
        else:
            self.chosenlist.append(self.lastdraw)
            self.chosenlist.append(self.w)
    def stack_pen(self):
        self.penmarklist.append(self.penonly)
        
    def callback(self,event):
        
        #print(self.stlist)
        for i in range(5):
            self.drawpad.delete(self.stlist.pop(-i))
        

def get_pic(pic_code, pic_name):
    image = open(pic_name, 'wb')
    image.write(b64decode(pic_code))
    image.close()




def newdraw():
   
    def askcolor_1():
        
        global col_1
        quest.attributes("-topmost", False)
        col_1=askcolor(color='black', title='请选择颜色')   
        quest.attributes("-topmost", True)
       
#新建画布    
    
    def confirm_1():
        global width_b
        global height_b
        width_b = int(drawboard_w.get())
        height_b = int(drawboard_h.get())    
              
        quest.destroy()
        #画板外框宽
        wid=width_b
        hei=height_b+50
        root.state('icon')
        
        draw= Toplevel() 
        draw.geometry("%dx%d" % (wid,hei))
        app = Application(master=draw)
        draw.mainloop()       
        
    def cancel_1():
        quest.destroy()
    
    quest = tk.Toplevel(root)
    quest.title('画布设置')
    quest.geometry('500x300')
    drawboard_w = tk.StringVar() 
    drawboard_w.set('1920') 
    tk.Label(quest, text='画布长度 ').place(x=20, y=20) 
    
    entry_w = tk.Entry(quest, textvariable=drawboard_w) 
    
    entry_w.place(x=130, y=20)
    
    drawboard_h = tk.StringVar() 
    drawboard_h.set('1080') 
    tk.Label(quest, text='画布高度 ').place(x=20, y=70)  
    entry_h= tk.Entry(quest, textvariable=drawboard_h)  
    entry_h.place(x=130, y=70)
    
    color_c = tk.Button(quest, text='选择画布颜色', command=askcolor_1)
    color_c.place(x=20, y=120)
    confirm = tk.Button(quest, text='新建画布', command=confirm_1)
    confirm.place(x=200,y=220)
    cancel = tk.Button(quest, text='取消', command=cancel_1)
    cancel.place(x=400,y=220)
    

#draw= Tk()
    #draw.geometry("%dx%d" % (win_width, win_height))
    #app = Application(master=draw)
    #draw.mainloop()
def browser():
    
    webbrowser.open('https://drawingsword.com/post/hua-tu-ruan-jian-shi-yong-zhi-nan/')


#创建主菜单
root.title("画图(design by zhu sir)")

root.geometry("%dx%d" % (win_width, win_height))


menubar = tk.Menu(root)
#新画板菜单栏
filemenu = tk.Menu(menubar,tearoff=0)
menubar.add_cascade(label='画图', menu=filemenu)
filemenu.add_command(label='新画板', command = newdraw)
filemenu.add_command(label='保存', command= None)
#设置菜单栏
settingmenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='设置', menu=settingmenu)
settingmenu.add_command(label='快捷键', command = None)

#帮助菜单栏
helpmenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='帮助', menu=helpmenu)
helpmenu.add_command(label="软件使用指南", command = browser)
a=random.randint(1,3)
name="bizhi"+str(a)+'_gif'
filename="bizhi"+str(a)+'.gif'
get_pic(eval(name), filename)
#增加背景图片

photo = tk.PhotoImage(file=filename)
theLabel = tk.Label(root,text ="新建画布以开始",justify=tk.LEFT,image=photo,compound = tk.CENTER,font=("微软雅黑light",50),fg = "white")

theLabel.pack()

root.config(menu=menubar)

root.mainloop()