鱼C论坛

 找回密码
 立即注册
查看: 871|回复: 9

[已解决]对话框不能退出

[复制链接]
发表于 2020-8-13 09:29:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. dialog = wx.TextEntryDialog(self, 'What is your favorite programming language?',
  2.                                     '对话框')
  3.             dialog.SetMaxLength(35)
  4.             if dialog.ShowModal() == wx.ID_OK:    # 如果用户单击了 OK 按钮
  5.                self.name = dialog.GetValue()
复制代码
弹出对话框后,按下对话框上的取消键不能退出对话框窗口,请问应该怎么样办


最佳答案
2020-8-13 09:32:54
我这测试是可以的,是不是你自己的操作问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 09:32:54 | 显示全部楼层    本楼为最佳答案   
我这测试是可以的,是不是你自己的操作问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 09:38:16 | 显示全部楼层
zltzlt 发表于 2020-8-13 09:32
我这测试是可以的,是不是你自己的操作问题?

我也没改动什么东西,然后点对话框右上角的 'x'也不能退出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 09:41:30 | 显示全部楼层
zltzlt 发表于 2020-8-13 09:32
我这测试是可以的,是不是你自己的操作问题?

运行你的原程序没问题,我把这个功能插到我的程序里就不能正常退出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 09:47:42 | 显示全部楼层
A.Lyapunov 发表于 2020-8-13 09:41
运行你的原程序没问题,我把这个功能插到我的程序里就不能正常退出了

把你的程序发上来看看?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 10:00:49 | 显示全部楼层
zltzlt 发表于 2020-8-13 09:47
把你的程序发上来看看?
  1. import numpy as np  # 数据处理的库 Numpy
  2. import cv2          # 图像处理的库 OpenCv
  3. import os
  4. import shutil
  5. import _thread
  6. import wx
  7. import csv
  8. from importlib import reload
  9. from skimage import io as iio
  10. import face_recognize_punchcard
  11. import sys
  12. # 创建 cv2 摄像头对象
  13. #    C++: VideoCapture::VideoCapture(int device);

  14. #API:http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture

  15. # 保存
  16. path_make_dir = "data/face_data/"

  17. path_feature_all = "data/all_face_feature.csv"

  18. info = 'icon/info.png'



  19. #register ui
  20. class   RegisterUi(wx.Frame):
  21.     def __init__(self,superion):
  22.         wx.Frame.__init__(self,parent=superion,title="人脸录入",size=(800,590),style=wx.DEFAULT_FRAME_STYLE|wx.STAY_ON_TOP)
  23.         self.SetBackgroundColour('white')
  24.         self.Center()
  25.         
  26.         

  27.         self.NewButton =  wx.Button(parent=self,pos=(50,120),size=(80,50),label='新建录入')

  28.         self.ShortCutButton = wx.Button(parent=self,pos=(50,220),size=(80,50),label='截图保存')

  29.         self.SaveButton =  wx.Button(parent=self,pos=(50,320),size=(80,50),label='完成录入')
  30.         
  31.         #self.OpenButton =  wx.Button(parent=self,pos=(50,450),size=(80,50),label='打开照片')

  32.         
  33.         self.PhotoButton =  wx.Button(parent=self,pos=(150,450),size=(80,50),label='照片录入')

  34.         # 封面图片
  35.         self.image_info = wx.Image(info, wx.BITMAP_TYPE_ANY).Scale(600, 480)
  36.         # 显示图片
  37.         self.bmp = wx.StaticBitmap(parent=self, pos=(180,20), bitmap=wx.Bitmap(self.image_info))

  38.         
  39.         self.Bind(wx.EVT_BUTTON,self.OnNewButtonClicked,self.NewButton)
  40.         self.Bind(wx.EVT_BUTTON,self.OnShortCutButtonClicked,self.ShortCutButton)
  41.         self.Bind(wx.EVT_BUTTON,self.OnSaveButtonClicked,self.SaveButton)
  42.         #self.Bind(wx.EVT_BUTTON,self.OnOpenFileClicked,self.OpenButton)
  43.         self.Bind(wx.EVT_BUTTON,self.OnPhotoButtonClicked,self.PhotoButton)
  44.         
  45.         self.ShortCutButton.Enable(enable=False)
  46.         self.SaveButton.Enable(False)

  47.         

  48.         self.sc_number = 0
  49.         self.register_flag = 0
  50.         self.name = ""
  51.         
  52.    
  53.     def OnPhotoButtonClicked(self,event):
  54.         def OnOpenFileClicked(self,event):
  55.             wildcard = 'All files(*.*)|*.*'
  56.             dialog = wx.FileDialog(None,'select',os.getcwd(),'',wildcard,wx.FD_OPEN)
  57.             #这个部分新旧版本有变化
  58.             if dialog.ShowModal() == wx.ID_OK:
  59.                 FileName = dialog.GetPath()
  60.                 dialog.Destroy
  61.             return FileName
  62.         #path_image = 'image/'  
  63.         #name = 'da'
  64.         #pics = os.listdir(path_image+name)
  65.         feature_list = []
  66.         feature_average = []
  67.         #for i in range(len(pics)):
  68.         name = wx.GetTextFromUser(message="请先输入录入者的姓名", caption="温馨提示",
  69.                                       default_value="", parent=None)
  70.         pic_path = OnOpenFileClicked(self,event)
  71.         print("正在读的人脸图像:", pic_path)   
  72.         img = iio.imread(pic_path)
  73.         img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  74.         dets = face_recognize_punchcard.detector(img_gray, 1)
  75.         if len(dets) != 0:
  76.             shape = face_recognize_punchcard.predictor(img_gray, dets[0])
  77.             face_descriptor = face_recognize_punchcard.facerec.compute_face_descriptor(img_gray, shape)
  78.             feature_list.append(face_descriptor)
  79.         else:
  80.             face_descriptor = 0
  81.             print("未在照片中识别到人脸")
  82.         if len(feature_list)>0:
  83.             for j in range(128):
  84.                 feature_average.append(0)
  85.                 for i in range(len(feature_list)):
  86.                     feature_average[j] += feature_list[i][j]
  87.                 feature_average[j] = (feature_average[j])/len(feature_list)
  88.             feature_average.append(name)
  89.         
  90.             with open(path_feature_all, "a+", newline="") as csvfile:
  91.                 writer = csv.writer(csvfile)
  92.                 print('写入一条特征人脸入库',feature_average)
  93.                 writer.writerow(feature_average)


  94.     def OnNewButtonClicked(self, event):
  95.         while self.name == '':
  96.             dialog = wx.TextEntryDialog(self, 'What is your favorite programming language?',
  97.                                     '对话框')
  98.             dialog.SetMaxLength(35)
  99.             if dialog.ShowModal() == wx.ID_OK:    # 如果用户单击了 OK 按钮
  100.                self.name = dialog.GetValue()   # 用 GetValue() 方法获
  101.                      
  102.             #self.name = wx.GetTextFromUser(message="请先输入录入者的姓名,用于创建姓名文件夹", caption="温馨提示",
  103.                                      # default_value="", parent=None)

  104.             # 监测是否重名
  105.             for exsit_name in (os.listdir(path_make_dir)):
  106.                 if self.name == exsit_name:
  107.                     wx.MessageBox(message="姓名已存在,请重新输入", caption="警告")
  108.                     self.name = ''
  109.                     break
  110.         os.makedirs(path_make_dir+self.name)
  111.         print("新建的人脸文件夹: ", path_make_dir+self.name)
  112.         self.NewButton.Enable(enable=False)
  113.         self.ShortCutButton.Enable(enable=True)
  114.         """使用多线程,子线程运行后台的程序,主线程更新前台的UI,这样不会互相影响"""
  115.         # 创建子线程,按钮调用这个方法,
  116.         _thread.start_new_thread(self._open_cap, (event,))

  117.     def OnShortCutButtonClicked(self,event):
  118.         self.SaveButton.Enable(True)
  119.         if len(self.rects) !=0:
  120.             # 计算矩形框大小,保证同步
  121.             height = self.rects[0].bottom() - self.rects[0].top()
  122.             width = self.rects[0].right() - self.rects[0].left()
  123.             self.sc_number += 1
  124.             im_blank = np.zeros((height, width, 3), np.uint8)
  125.             for ii in range(height):
  126.                 for jj in range(width):
  127.                     im_blank[ii][jj] = self.im_rd[self.rects[0].top() + ii][self.rects[0].left() + jj]
  128.             # cv2.imwrite(path_make_dir+self.name + "/img_face_" + str(self.sc_number) + ".jpg", im_blank)
  129.             # cap = cv2.VideoCapture("***.mp4")
  130.             # cap.set(cv2.CAP_PROP_POS_FRAMES, 2)
  131.             # ret, frame = cap.read()
  132.             # cv2.imwrite("我//h.jpg", frame)  # 该方法不成功

  133.             #解决python3下使用cv2.imwrite存储带有中文路径图片
  134.             cv2.imencode('.jpg', im_blank)[1].tofile(path_make_dir+self.name + "/img_face_" +
  135.                                                      str(self.sc_number) + ".jpg") #正确方法
  136.             print("写入本地:", str(path_make_dir+self.name) + "/img_face_" + str(self.sc_number) + ".jpg")

  137.         else:
  138.             print("未检测到人脸,识别无效,未写入本地")

  139.     def OnSaveButtonClicked(self,event):


  140.         self.bmp.SetBitmap(wx.Bitmap(self.image_info))
  141.         self.NewButton.Enable(True)
  142.         self.SaveButton.Enable(False)
  143.         self.ShortCutButton.Enable(False)


  144.         # 释放摄像头
  145.         self.cap.release()
  146.         # 删除建立的窗口
  147.         #cv2.destroyAllWindows()

  148.         if self.register_flag == 1:
  149.             if os.path.exists(path_make_dir+self.name):
  150.                 shutil.rmtree(path_make_dir+self.name)
  151.                 print("重复录入,已删除姓名文件夹", path_make_dir+self.name)

  152.         if self.sc_number == 0 and len(self.name)>0:
  153.             if os.path.exists(path_make_dir+self.name):
  154.                 shutil.rmtree(path_make_dir+self.name)
  155.                 print("您未保存截图,已删除姓名文件夹", path_make_dir+self.name)
  156.         if self.register_flag==0 and self.sc_number!=0:
  157.             pics = os.listdir(path_make_dir+self.name)
  158.             feature_list = []
  159.             feature_average = []
  160.             for i in range(len(pics)):
  161.                 pic_path = path_make_dir+self.name + "/" + pics[i]
  162.                 print("正在读的人脸图像:", pic_path)
  163.                 img = iio.imread(pic_path)
  164.                 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  165.                 dets = face_recognize_punchcard.detector(img_gray, 1)
  166.                 if len(dets) != 0:
  167.                     shape = face_recognize_punchcard.predictor(img_gray, dets[0])
  168.                     face_descriptor = face_recognize_punchcard.facerec.compute_face_descriptor(img_gray, shape)
  169.                     feature_list.append(face_descriptor)
  170.                 else:
  171.                     face_descriptor = 0
  172.                     print("未在照片中识别到人脸")
  173.             if len(feature_list)>0:
  174.                 for j in range(128):
  175.                     feature_average.append(0)
  176.                     for i in range(len(feature_list)):
  177.                         feature_average[j] += feature_list[i][j]
  178.                     feature_average[j] = (feature_average[j])/len(feature_list)
  179.                 feature_average.append(self.name)

  180.                 with open(path_feature_all, "a+", newline="") as csvfile:
  181.                     writer = csv.writer(csvfile)
  182.                     print('写入一条特征人脸入库',feature_average)
  183.                     writer.writerow(feature_average)

  184.         self.name = ""
  185.         self.register_flag = 0
  186.         self.sc_number = 0;




  187.     def _open_cap(self,event):
  188.         # reload(facerec)
  189.         reload(face_recognize_punchcard)
  190.         # reload(predictor)
  191.         # reload(detector)
  192.         # reload(return_euclidean_distance())

  193.         #self.cap = cv2.VideoCapture(0)
  194.         video = "http://admin:admin@192.168.0.102:8081/"  # 此处@后换成我们之前获取到的app局域网地址
  195.         self.cap = cv2.VideoCapture(video)#引入视频地址,video其实也可以换成你电脑中的视频地址可以制作成一个播放器。
  196.         


  197.         # cap.set(propId, value)
  198.         # 设置视频参数,propId 设置的视频参数,value 设置的参数值
  199.         self.cap.set(3, 480)
  200.         #self.cap.set(cv2.CAP_PROP_FPS,5)
  201.         while self.cap.isOpened():
  202.             # cap.read()
  203.             # 返回两个值:
  204.             #    一个布尔值 true/false,用来判断读取视频是否成功/是否到视频末尾
  205.             #    图像对象,图像的三维矩阵q
  206.             flag, self.im_rd = self.cap.read()
  207.             # 人脸数 rects
  208.             self.rects = face_recognize_punchcard.detector(self.im_rd, 1)

  209.             cv2.waitKey(1)  # 必不可少
  210.             # 待会要写的字体
  211.             font = cv2.FONT_HERSHEY_SIMPLEX

  212.             if len(self.rects) != 0:
  213.                 # 检测到人脸
  214.                 # 矩形框#d是人脸

  215.                 # 查重
  216.                 features_cap = face_recognize_punchcard.facerec.compute_face_descriptor(self.im_rd, face_recognize_punchcard.predictor(self.im_rd, self.rects[0]))
  217.                 for i in range(len(face_recognize_punchcard.features_known_arr)):
  218.                     # 将某张人脸与存储的所有人脸数据进行比对
  219.                     compare = face_recognize_punchcard.return_euclidean_distance(features_cap, face_recognize_punchcard.features_known_arr[i][0:-1])
  220.                     if compare == "same":  # 找到了相似脸
  221.                         face_name = face_recognize_punchcard.features_known_arr[i][-1]
  222.                         print(face_name)
  223.                         #wx.MessageBox(message=face_name + ",您已成功录过人脸,无需再录入!", caption="警告")
  224.                         wx.MessageDialog(self, face_name + ",您已成功录过人脸,无需再录入!", style=wx.OK | wx.CENTER | wx.STAY_ON_TOP).ShowModal()
  225.                         self.NewButton.Enable(False)
  226.                         self.ShortCutButton.Enable(False)
  227.                         self.SaveButton.Enable(True)
  228.                         self.register_flag = 1

  229.                 for k, d in enumerate(self.rects):
  230.                     # 根据人脸大小生成空的图像
  231.                     # 最后一个参数是线宽
  232.                     cv2.rectangle(self.im_rd, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (255, 0, 0), 2)

  233.                 # 显示人脸数
  234.             cv2.putText(self.im_rd, "Faces: " + str(len(self.rects)), (50, 80), font, 0.8, (255, 0, 0), 1, cv2.LINE_AA)
  235.             cv2.putText(self.im_rd, "Warning: please shortcut having rectangle", (50, 140), font, 0.8, (0, 0, 255), 1,
  236.                         cv2.LINE_AA)

  237.             # print(im_rd.shape)
  238.             height, width = self.im_rd.shape[:2]
  239.             image1 = cv2.cvtColor(self.im_rd, cv2.COLOR_BGR2RGB)
  240.             pic = wx.Bitmap.FromBuffer(width, height, image1)
  241.             # 显示图片在panel上
  242.             self.bmp.SetBitmap(pic)

  243.             #直接在sbclicked里设置self.bmp.SetBitmap(wx.Bitmap(self.image_cover)),子线程还在运行
  244.             if self.NewButton.IsEnabled()==True and self.ShortCutButton.IsEnabled()==False and self.SaveButton.IsEnabled()==False:
  245.                 self.bmp.SetBitmap(wx.Bitmap(self.image_info))
  246.                 _thread.exit()



  247. # app = wx.App()
  248. #
  249. # frame = RegisterUi(None)
  250. # frame.Show()
  251. # app.MainLoop()

  252. #cap.isOpened() 返回 true/false 检查初始化是否成功
复制代码

我把它放在一个while循环里面了,不知道是不是因为条件不满足,跳不出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 10:36:15 | 显示全部楼层
zltzlt 发表于 2020-8-13 09:47
把你的程序发上来看看?

我刚刚传了完整的程序,但是还在审核。先传这一部分
  1. while self.name == '':
  2.             
  3.             dialog = wx.TextEntryDialog(self, 'What is your favorite programming language?','对话框')
  4.             dialog.SetMaxLength(35)
  5.             if dialog.ShowModal() == wx.ID_OK:    # 如果用户单击了 OK 按钮
  6.                    self.name = dialog.GetValue()   # 用 GetValue() 方法获得
  7.             #self.name = wx.GetTextFromUser(message="请先输入录入者的姓名,用于创建姓名文件夹", caption="温馨提示",
  8.                                     # default_value="", parent=None)

  9.             # 监测是否重名
  10.             for exsit_name in (os.listdir(path_make_dir)):
  11.                 if self.name == exsit_name:
  12.                     wx.MessageBox(message="姓名已存在,请重新输入", caption="警告")
  13.                     self.name = ''
  14.                     break
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 10:41:10 | 显示全部楼层
A.Lyapunov 发表于 2020-8-13 10:36
我刚刚传了完整的程序,但是还在审核。先传这一部分

你这样试试:

  1.     def OnNewButtonClicked(self, event):
  2.         while self.name == '':
  3.             dialog = wx.TextEntryDialog(self, 'What is your favorite programming language?',
  4.                                         '对话框')
  5.             dialog.SetMaxLength(35)
  6.             if dialog.ShowModal() == wx.ID_OK:  # 如果用户单击了 OK 按钮
  7.                 self.name = dialog.GetValue()  # 用 GetValue() 方法获

  8.             # self.name = wx.GetTextFromUser(message="请先输入录入者的姓名,用于创建姓名文件夹", caption="温馨提示",
  9.             # default_value="", parent=None)

  10.         # 监测是否重名
  11.         for exsit_name in (os.listdir(path_make_dir)):
  12.             if self.name == exsit_name:
  13.                 wx.MessageBox(message="姓名已存在,请重新输入", caption="警告")
  14.                 self.name = ''
  15.                 break
  16.         os.makedirs(path_make_dir + self.name)
  17.         print("新建的人脸文件夹: ", path_make_dir + self.name)
  18.         self.NewButton.Enable(enable=False)
  19.         self.ShortCutButton.Enable(enable=True)
  20.         """使用多线程,子线程运行后台的程序,主线程更新前台的UI,这样不会互相影响"""
  21.         # 创建子线程,按钮调用这个方法,
  22.         _thread.start_new_thread(self._open_cap, (event,))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 10:46:49 | 显示全部楼层

请问你改了哪里啊,和我的一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 14:15:09 | 显示全部楼层

你好,可以麻烦再看看吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 14:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表