0
0 комментариев

Здравствуйте. К сожалению плохо знаком с Python. Реализован элементарный рисовальщик на Tkinter. Сама программа работает с подключением библиотеки Caffe для распознавания рукописных цифр.
По нажатию кнопки Recognize должен произойти вызов subprocess.popen() команды

python /Users/DiKey/caffe-master/python/classify.py —print_results —model_def /Users/DiKey/caffe-master/examples/mnist/lenet.prototxt —pretrained_model /Users/DiKey/caffe-master/examples/mnist/lenet_iter_60000.caffemodel —force_grayscale —center_only —labels_file /Users/DiKey/caffe-master/data/mnist/mnist_words.txt —images_dim 28,28 /Users/DiKey/Documents/Xcode/NeuralNetwork/Digit.png results file

от туда хочется получить последнюю строку(из данных выведенных в консоли после запуска команды)
и распечатать эту строку в Label Ткинтера.

На деле при нажатии на кнопку вылетает ошибка Python неожиданно завершил работу. Проверки показали, что root = Tk() и вызов subprocess.popen дают эту ошибку. То есть я могу либо открыть графический интерфейс и работать в нем, но не использовать subprocess.popen , либо я могу использовать subprocess.popen, но тогда я должен закомментить вызов root= Tk()

В чем проблема? Что я делаю не так?

КОД :

import sys
import os
import subprocess
from subprocess import *
import Tkinter
from Tkinter import *
from PIL import Image,ImageDraw
import tkFileDialog
import cv2
import matplotlib
matplotlib.rcParams['backend'] = "Qt4Agg"
import numpy
import lmdb
 
#white = (255,255,255)
 
class Paint(Frame):
 def __init__(self, parent):
    Frame.__init__(self, parent)
 
    self.parent = parent
    self.color = "white"
    self.configure(background='grey')
    self.brush_size = 15
    self.setUI()
 
def Clear_all(self):
    self.canv.delete("all")
    del self.cv_pil
    del self.img_pil
    self.img_pil = Image.new("L", (222, 223), 0)
    self.cv_pil = ImageDraw.Draw(self.img_pil)
 
def Save(self):
    filename = "/Users/DiKey/Documents/Xcode/NeuralNetwork/Digit.png"
    self.img_pil.save(filename)
 
def set_brush_size(self, new_size):
    self.brush_size = new_size
 
def set_label_digit(self):
    filename = "/Users/DiKey/Documents/Xcode/NeuralNetwork/Digit.png"
    self.img_pil.save(filename)
    v = StringVar()
    digit=Label(self, textvariable=v,font=("Helvetica", 95))
    digit.grid(row=3,column=3)
    p = subprocess.Popen(["python /Users/DiKey/caffe-master/python/classify.py --print_results --model_def /Users/DiKey/caffe-master/examples/mnist/lenet.prototxt --pretrained_model /Users/DiKey/caffe-master/examples/mnist/lenet_iter_60000.caffemodel --force_grayscale --center_only --labels_file /Users/DiKey/caffe-master/data/mnist/mnist_words.txt --images_dim 28,28 /Users/DiKey/Documents/Xcode/NeuralNetwork/Digit.png resultsfile"], shell=True,stdout=subprocess.PIPE)
    p.wait()    # дождаться выполнения
    result = p.communicate()[0]
    v.set(result)
 
def draw(self, event):
    self.canv.create_oval(event.x - self.brush_size,event.y - self.brush_size,event.x + self.brush_size,event.y + self.brush_size,fill=self.color, outline=self.color)
    self.cv_pil.ellipse((event.x - self.brush_size,event.y - self.brush_size,event.x + self.brush_size,event.y + self.brush_size),fill=self.color, outline=self.color)
 
def setUI(self):
 
    self.parent.title("Digits Recognition")
    self.pack(fill=BOTH, expand=1)
 
    self.columnconfigure(6, weight=1)
    self.rowconfigure(2, weight=1)
 
    self.canv = Canvas(self,width=222,height=223, bg="black")
    self.canv.grid(row=2, column=0, columnspan=7,
                   padx=5, pady=5)
    self.img_pil = Image.new("L", (222, 223), 0)
    self.cv_pil = ImageDraw.Draw(self.img_pil)
    #black = (0, 0, 0)
    # img_pil = Image.new("RGB", (222, 223), black)
    #cv_pil = ImageDraw.Draw(img_pil)
 
    self.canv.bind("<B1-Motion>", self.draw)
 
    color_lab = Label(self, text="CLEAR: ")
    color_lab.grid(row=0, column=0, padx=6)
 
    clear_btn = Button(self, text="Clear all", width=10,
                                      command=lambda: self.Clear_all())
    clear_btn.grid(row=0, column=1, sticky=W)
 
    save = Button(self, text="Save", width=10,
                      command=lambda: self.Save())
    save.grid(row=0, column=2, sticky=W)
 
    recognize_btn = Button(self, text="RECOGNIZE", width=20,
                  command=lambda: self.set_label_digit())
    recognize_btn.grid(row=3, column=2)
    #digit= Label(self, text="",font=("Helvetica", 45));
    #digit.grid(row=3,column=3)
 
 
 
def main():
  root = Tk()
  root.geometry("600x600+300+300")
  app = Paint(root)
  root.mainloop()
 
 
if __name__ == '__main__':
  main()

Изменен статус публикации
Добавить комментарий