模块一:main主函数

from tkinter import (Tk, Text, Scrollbar)
from tkinter.constants import (HORIZONTAL, VERTICAL, RIGHT, LEFT, X, Y, BOTH, BOTTOM, YES, NONE, END, CURRENT)
import time
import tkinter as tk
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import os
from tkinter import filedialog,ttk
from PIL import ImageTk, Image
from tkinter import StringVar
import botton
import get
import pickle

gui = tk.Tk()  
gui.title("用户登录")
canvas_root = tk.Canvas(gui, width=500, height=300)
im_root = get.get_img(r"C:\Users\xujunkang\Desktop\nexchip.jpg", 1000, 600)
canvas_root.create_image(500, 300, image= im_root)
canvas_root.pack(side="top")

# 两个文字标签,用户名和密码两个部分
tk.Label(gui, text='用户名').place(x=100, y=150)
tk.Label(gui, text='密  码').place(x=100, y=190)

var_usr_name = tk.StringVar()  # 讲文本框的内容,定义为字符串类型
var_usr_name.set('123456789@qq.com')  # 设置默认值
var_usr_pwd = tk.StringVar()

# 第一个输入框-用来输入用户名的。
# textvariable 获取文本框的内容
entry_usr_name = tk.Entry(gui, textvariable=var_usr_name)
entry_usr_name.place(x=160, y=150)
# 第二个输入框-用来输入密码的。
entry_usr_pwd = tk.Entry(gui, textvariable=var_usr_pwd, show='*')
entry_usr_pwd.place(x=160, y=190)

count = 0
def usr_login():
    usr_name = var_usr_name.get()
    usr_pwd = var_usr_pwd.get()
    try:
        with open('usrs_info.pickle', 'rb') as usr_file:
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        with open('usrs_info.pickle', 'wb') as usr_file:
            usrs_info = {'admin': 'admin'}
            pickle.dump(usrs_info, usr_file)

if usr_name in usrs_info:
        global count
        if usr_pwd == usrs_info[usr_name]:
            gui.destroy()
            botton.main_1()
        elif count < 5:
            tk.messagebox.showinfo(title='登录提示',message='用户名或密码错误!')#登录提示
            count += 1#计数加一
        else:
          tk.messagebox.showinfo(title='登录提示',message='已连续错误5次!请稍后再试!');gui.destroy()
    else:
        is_sign_up = tk.messagebox.askyesno('提示', '你还没有注册,请先注册')
        print(is_sign_up)
        if is_sign_up:
            usr_sign_up()

# 注册按钮
def usr_sign_up():
    def sign_to_Mofan_Python():
        np = new_pwd.get()
        npf = new_pwd_confirm.get()
        nn = new_name.get()
        # 上面是获取数据,下面是查看一下是否重复注册过
        with open('usrs_info.pickle', 'rb') as usr_file:
            exist_usr_info = pickle.load(usr_file)
            if np != npf:
                tk.messagebox.showerror('错误提示', '密码和确认密码必须一样')
            elif nn in exist_usr_info:
                tk.messagebox.showerror('错误提示', '用户名早就注册了!')
            else:
                exist_usr_info[nn] = np
                with open('usrs_info.pickle', 'wb') as usr_file:
                    pickle.dump(exist_usr_info, usr_file)
                tk.messagebox.showinfo('欢迎', '你已经成功注册了')
                window_sign_up.destroy()

# 点击注册之后,会弹出这个窗口界面。
    window_sign_up = tk.Toplevel(gui)
    window_sign_up.title('欢迎注册')
    window_sign_up.geometry('360x200')  # 中间是x,而不是*号

# 用户名框--这里输入用户名框。
    new_name = tk.StringVar()
    new_name.set('123456789@qq.com')  # 设置的是默认值
    tk.Label(window_sign_up, text='用户名').place(x=10, y=10)
    entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)
    entry_new_name.place(x=100, y=10)

# 新密码框--这里输入注册时候的密码
    new_pwd = tk.StringVar()
    tk.Label(window_sign_up, text='密  码').place(x=10, y=50)
    entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')
    entry_usr_pwd.place(x=100, y=50)
    # 密码确认框
    new_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, text='确认密码').place(x=10, y=90)
    entry_usr_pwd_confirm = tk.Entry(
        window_sign_up, textvariable=new_pwd_confirm, show='*')
    entry_usr_pwd_confirm.place(x=100, y=90)

btn_confirm_sign_up = tk.Button(
        window_sign_up, text=' 注  册 ', command=sign_to_Mofan_Python)
    btn_confirm_sign_up.place(x=120, y=130)

# 创建注册和登录按钮
btn_login = tk.Button(gui, text=' 登  录 ', command=usr_login)
btn_login.place(x=150, y=230)  # 用place来处理按钮的位置信息。
btn_sign_up = tk.Button(gui, text=' 注  册 ', command=usr_sign_up)
btn_sign_up.place(x=250, y=230)

gui.mainloop()

#button = tk.Button(gui, text="注册账户", command= build)
#button.place(x=100, y=200, width=50, height=40)

#button2 = tk.Button(gui, text="退出", command= destory)
#button2.place(x=100, y=250, width=50, height=40)
gui.mainloop()  
模块二:botton模块

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 25 11:15:48 2022

@author: xujunkang
"""

from tkinter import (Tk, Text, Scrollbar)
from tkinter.constants import (HORIZONTAL, VERTICAL, RIGHT, LEFT, X, Y, BOTH, BOTTOM, YES, NONE, END, CURRENT)
import time
import tkinter as tk
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import os
from tkinter import filedialog,ttk
from PIL import ImageTk, Image
from tkinter import StringVar
import openpyxl
from openpyxl import Workbook
import get

def main_1():
    root = tk.Tk()  
    root.title("轮廓提取APP")
    
    canvas_root = tk.Canvas(root, width=1000, height=600)
    im_root = get.get_img(r"X:/04 project/08python_study/open_cv/image.JPG", 1000, 600)
    canvas_root.create_image(500, 300, image= im_root)
    canvas_root.pack(side="top") 
    
    label = tk.Label(root,text="提取TEM轮廓",font=("Arial",20))
    # 显示label,pack函数是自适应
    label.place(x=300, y=50, width=500, height=40)
    
    
    btn1 = tk.Button(root)  # 创建按钮,并且将按钮放到窗口里面
    btn1["text"] = "点击查看轮廓情况"  # 给按钮一个名称
    btn1.place(x=100, y=550, width=100, height=40)  # 按钮布局
    
    
    
    def getfile():
         file_path=filedialog.askopenfilename()
         fpath.set(file_path)
      
    def destory():
        root.destroy()
    
    
    
    fpath = tk.StringVar()
    text = tk.Entry(root, textvariable= fpath)
    text.place(x=600, y=550, width=300, height=40)
    
    
    menus=tk.Menu(root)#在window上创建一个菜单栏menus
    num1=tk.Menu(menus)#在menus上面创建一个选项栏num1
    menus.add_cascade(label='文件',menu=num1)#将num1命名为Menu1
    num1.add_command(label='打开',command=getfile)#在num1上增加一个Open命令,执行的cod
    num1.add_command(label='退出',command=destory)#在num1上增加一个退出命令
    num2=tk.Menu(menus)#在menus上面创建一个选项num1
    menus.add_cascade(label='编辑',menu=num2)#将num2命名为Menu1
    num2.add_command(label='撤销')
    num2.add_command(label='复制',command=destory)#在num2上增加一个退出命令
    root.config(menu=menus)#将window的menu改为我们所定义的menus
    
    
    def threshold_demo(image):
            # 去噪声+二值化
         dst = cv.GaussianBlur(image,(3, 3), 0)
         gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
         ret, binary = cv.threshold(gray, 90, 255, cv.THRESH_BINARY)
         cv.imshow("binary", binary)
         return binary
        
    
        
    
    def canny_demo(image):
          t = 100
          canny_output = cv.Canny(image, t, t * 2)
          cv.imshow("canny_output", canny_output)
          return canny_output
        
    
    def contour(img_input):
          src = cv.imread(img_input)
    
    
          height,width = src.shape[:2]
    
          img=cv.resize(src,(width//2,height//2),interpolation=cv.INTER_CUBIC) 
    
          binary = threshold_demo(img)
    
        
    
        # 轮廓发现
          contours, hierarchy= cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    
          cv.drawContours(img, contours, -1, (0, 110, 255), 2)  # 2为像素大小,-1时填充轮廓
         
        
    
        # 显示
          cv.imshow("contours-demo",img)
        
          cv.waitKey(0)
          cv.destroyAllWindows()
         
              
          
          log= tk.Tk()
          log.title('output')
          log.geometry('630x630')
          
          scroll = tk.Scrollbar(log)
    # 放到窗口的右侧, 填充Y竖直方向
          
          txt = tk.Text(log)
          scroll.pack(side=tk.RIGHT,fill=tk.Y)
          txt.pack(side=tk.LEFT,fill=tk.Y)
    # 两个控件关联
          scroll.config(command=txt.yview)
          txt.config(yscrollcommand=scroll.set)
          
          
          txt.insert(tk.INSERT,contours)
          wb = Workbook()
          dest_filename = "Empty_book.xlsx"
          ws1 = wb.active
          ws1.title = 'TEMcontours'
          row= ws1.max_row
          print(row)
          col= ws1.max_column
          print(col)
          A= contours[0]
          B=A.tolist()
          L=len(B)
          print()
          for i in range(0,L):
                  C=B[i]
                  ws1.append(C[0])
          wb.save(dest_filename)
          log.mainloop()
    
    def start(e):
          window = tk.Tk()
          window.title('running')
          window.geometry('630x150')
     
    # 设置下载进度条
          tk.Label(window, text='程序运行中' ).place(x=50, y=60)
          canvas = tk.Canvas(window, width=465, height=22, bg="white")
          canvas.place(x=110, y=60)
          fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green")
          x = 300  # 未知变量,可更改
          n = 465 / x  # 465是矩形填充满的次数
          for i in range(x):
            n = n + 465 / x
            canvas.coords(fill_line, (0, 0, n, 60))
            window.update()
            time.sleep(0.001)  # 控制进度条流动的速度
     
        # 清空进度条
          fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="white")
          x = 500  # 未知变量,可更改
          n = 465 / x  # 465是矩形填充满的次数
     
          for t in range(x):
             n = n + 465 / x
            # 以矩形的长度作为变量值更新
             canvas.coords(fill_line, (0, 0, n, 60))
             window.update()
             time.sleep(0)  # 时间为0,即飞速清空进度条
          window.destroy()
          
          
          img_path= fpath.get()
          contour(img_path)
          
          
    
    btn1.bind("<Button-1>", start)  # 将按钮和方法进行绑定,也就是创建了一个事件
    
    
    
    
    root.mainloop()  # 加上这一句,就可以看见窗口了

模块三:

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 26 13:19:09 2022

@author: xujunkang
"""
from tkinter import (Tk, Text, Scrollbar)
from tkinter.constants import (HORIZONTAL, VERTICAL, RIGHT, LEFT, X, Y, BOTH, BOTTOM, YES, NONE, END, CURRENT)
import time
import tkinter as tk
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import os
from tkinter import filedialog,ttk
from PIL import ImageTk, Image
from tkinter import StringVar
import botton

def get_img(filename, width, height):
    im = Image.open(filename).resize((width, height))
    im = ImageTk.PhotoImage(im)
    return im

模块四:excel

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 19 14:32:51 2022

@author: xujunkang
"""
import openpyxl

workbook = openpyxl.load_workbook("X:/04 project/08python_study/open_cv/Empty_book.xlsx")
print(workbook.sheetnames)

# 2.通过 sheet 名称获取表格
sheet1 = workbook["TEMcontours"]
print(sheet1)
print(sheet1.dimensions)
A=sheet1.min_column
B=sheet1.max_column
C=sheet1.min_row
D=sheet1.max_row
print(A)
print(B)
print(C)
print(D)
points=[]
for i in range(1,D):
    for j in range(1,B):
        cell=sheet1.cell(row=i,column=j).value
        j=j+1
        cell2=sheet1.cell(row=i,column=j).value
        list1=(cell,cell2)
        points.append(list1)
print(points)

python制作APP,此APP可识别TEM图片结构轮廓,并将坐标提取到excel中,画出TEM结构轮廓图(tkinter,opencv-python)相关推荐

  1. 用 Python 在 Excel 中画出蒙娜丽莎

    文 | 麦麦麦造 出处 | 掘金 之前看到过很多头条,说哪国某人坚持了多少年自学使用 excel 画画,效果十分惊艳.对于他们的耐心我十分敬佩.但是作为一个程序员,自然也得挑战一下自己.这种需求,我们 ...

  2. 美国确诊超100万!教你用Python画出全球疫情动态图

    目前,全球新冠疫情还十分严峻.截止4月29日,疫情突破多个标志性的统计节点.其中,全球累计确诊近296万例,累计死亡超20万例:美国累计确诊超100万例,西班牙和意大利累计确诊均超过20万例. 01 ...

  3. df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...

     CDA数据分析师 出品   [导语]:今天我们教你用Python绘制全球疫情动态图,技术部分请看第二部分. 获取数据:扫描下方公众号回复关键字"全球疫情" 目前,全球新冠疫情还十 ...

  4. python画三维立体图-如何在论文中画出漂亮的插图?

    ----2020.08.07增---- 看到评论区有人说"没代码没教程所以没帮助"-- 好吧,我寻思链接.参考资料都在回答中给出来了呀(可能不够明显?) 于是,重新整理.注释了一下 ...

  5. python画笔的尺寸_Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图...

    介绍 本文不是一篇详尽的.从简到繁的 Maplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的.基础的操作.本文不对各种数据图(折线图.柱状图等)作介 ...

  6. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中

    小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...

  7. python如何画3个相切的圆_如何在几何画板中画出三个两两相切的圆

    <圆和圆的位置关系>是人教版九年级数学必学内容,在学习圆与圆的位置关系时,我们都知道圆与圆的位置关系有:相离,外切,相交,内切,内含,它们之间的位置是由圆心距与两半径的长度来确定的.那么如 ...

  8. python 论文插图_如何在python论文中画出漂亮的插图?-from知乎

    如何在论文中画出漂亮的插图? 经常看到别人论文中画出各种绚烂的插图,我想知道这些图都是用一些什么样的软件画出来的.比如下面给出的几张,好吧,我承认有的并不那么绚烂,但用什么样的软件比较合适呢?具体答案 ...

  9. 用Python在Excel里画出蒙娜丽莎的方法示例

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.sfkyty.com ...

  10. 盘点一个使用Python实现Excel中找出第一个及最后一个不为零的数,它们各自在第几列

    一.前言 前几天在Python交流群中遇到一个问了一个使用Python实现Excel中找出第一个及最后一个不为零的数,它们各自在第几列的问题,觉得还挺有用的,这里拿出来跟大家一起分享下. 数据截图如下 ...

最新文章

  1. 四、物理数据模型PDM(Physical Data Model )
  2. 数据流小说带点h_H.264数据流格式
  3. vim + cscope + kscope
  4. jquery自己主动旋转的登录界面的背景代码登录页背景图
  5. 元素周期表排列的规律_中考化学:金属活动性顺序表和元素周期表规律总结
  6. Java | Assignment Statements Expressions
  7. Swipper.js实现轮播功能
  8. xd使用技巧_魔兽世界怀旧服老玩家才会的治疗技巧,这四个技能需要看时机选择...
  9. 运行初始化过程代码笔记
  10. Android 虚线切割线
  11. 数据库系统概论第五版(王珊)-系统篇(十二)
  12. 考研复习 求解函数极限的方法全总结
  13. TCP通信协议基本操作
  14. DAS NAS SAM FC
  15. 12、Horizon 域控组策略管理
  16. (半翻译)篡改mac应用后,如何resign签名,重新获得mac系统的信任?
  17. 用MATLAB计算常规矩阵函数 eAt sinA
  18. c语言日历时钟编程,基于DS1302的日历时钟(1602液晶显示DS1302时钟)C语言程序设计...
  19. 色环电阻是如何读取其标识的?
  20. zzulioj1134: 字符串转换

热门文章

  1. centos7安裝搜狗輸入法_centos7安装搜狗输入法
  2. 2022年全球市场电镀金刚石线总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. 数据库概述05(数据库查询及修改操作)
  4. 理科生的人生感悟-02-别忘了别人的痛苦 - 丰收之歌和围墙外的稻田
  5. mysql character_set_client 设置_关于MySQL如何修改character_set_client的编码问题
  6. 贪心——Berserk And Fireball
  7. win10电脑录教学视频的时候有回声或者通话的时候有回声,严重干扰录制效果,解决方式。...
  8. 伺服电机驱动器编程用c语言吗,伺服电机如何编程
  9. resource failed to call close
  10. 抢票助手-for 12306买火车票.订票助手.高铁.动车.春运.车票管家.自动刷票.列车时刻表