Кнопка Tkinter не работает в исполняемом файле, но работает при выполнении скрипта - PullRequest
0 голосов
/ 23 мая 2018

Я новичок на этом форуме и в Tkinter, и мне нужна ваша помощь.Я пытаюсь создать графический интерфейс.Моя программа отлично работает, когда я запускаю файл с Python 2.7, но одна кнопка не работает, когда я создаю исполняемый файл благодаря pyinstaller.

Моя программа довольно проста: я выбираю камеру всписок доступных, нажмите на кнопку «Показать» и видеорамка с выбранной камеры должна отобразиться в новом окне, благодаря opencv.Кнопка «Выход» предназначена для выхода из приложения.

Когда я создаю исполняемый файл благодаря pyinstaller, отображается окно, я могу выбрать камеру, но кнопка «Дисплей» не работает.Я действительно не понимаю, почему, и сообщение об ошибке не отображается.

Большое спасибо за вашу помощь

import cv2 
from Tkinter import *



class Gui:

    def __init__(self):
        self.root = Tk() 
        self.root.title("Rééducation posturale")
        self.root.config(background="#FA8066")

        self.root.rowconfigure(0, weight=1)
        self.root.rowconfigure(1, weight=1)
        self.root.columnconfigure(0, weight=1)
        self.root.columnconfigure(1, weight=1)


        self.boutonquitter=Button(self.root,text='Quit',font=("Helvetica", 10),command=self.Quitapp)
        self.boutonquitter.pack()
        self.boutonquitter.grid(row=1, column=1)



        camIndices=self.detectNumCameras()
        camIndex = []
        for n in xrange(camIndices):
            camIndex.append(n) 

        # LIST OF AVAILABLE CAMERA
        Label(self.root, text="Camera",font=("Helvetica", 10), bg="#ECA7A6").grid(row=0, column=0)
        self.cameraIndex = StringVar(self.root)
        self.cameraIndex.set("Choose camera")
        dropCamera = apply(OptionMenu, (self.root, self.cameraIndex) + tuple(camIndex))
        dropCamera.grid(row=0, column=1)  

        #CLICK TO DISPLAY
        self.bouton = Button(self.root, text="Display", font=("Helvetica", 10), command=self.checkCamera)
        self.bouton.pack()
        self.bouton.grid(row=1, column=0) 

        imageFrame = Frame(self.root, width=600, height=400)
        self.display = Label(imageFrame)
        self.root.mainloop()


    # DETECT CAMERAS
    def detectNumCameras(self):
        ind = 0
        while True:
            vc = cv2.VideoCapture(ind)
            if (vc.isOpened()):
                ind += 1
                vc.release()
            else:
                break
        return(ind)



    def checkCamera(self):
        try:
            self.cam.release()
        except:
            pass
        self.cam=cv2.VideoCapture(int(self.cameraIndex.get()))
        _,frame=self.cam.read()
        self.display.after(10,self.show_frame)


    #CLOSE THE APP
    def Quitapp(self):
        self.root.destroy()
        cv2.destroyAllWindows()


    #DISPLAY FRAME IN A NEW WINDOW
    def show_frame(self):
        ret,frame = self.cam.read()

        if ret is True:        
            cv2.imshow('Video',frame)
            cv2.waitKey(1)
            self.display.after(10, self.show_frame)

Gui()

Редактировать: я пытался с py2exe и удалил python 2.7 для установкиPython 3.6 и у меня все еще есть та же проблема ... Мой код также проще:

import cv2
import tkinter as tk
from PIL import Image, ImageTk


class Gui:

    def __init__(self):
        self.root = tk.Tk() 
        width, height = 800, 600
        self.cam = cv2.VideoCapture(0)
        self.cam.set(cv2.CAP_PROP_FRAME_WIDTH, width)
        self.cam.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

        self.root.title("Test")

        #CLICK TO DISPLAY
        self.bouton = tk.Button(self.root, text="Display", font=("Helvetica", 10), command=self.CreateNewWindow)
        self.bouton.pack()

        self.boutonquitter=tk.Button(self.root,text='Quit',font=("Helvetica", 10),command=self.Quitapp)
        self.boutonquitter.pack()

        self.root.mainloop()


    def CreateNewWindow(self):
        self.top = tk.Toplevel()
        self.top.title("window")
        self.lmain = tk.Label(self.top)
        self.lmain.pack()
        self.lmain.after(10, self.show_frame)


    #CLOSE THE APP
    def Quitapp(self):
        self.root.destroy()
        cv2.destroyAllWindows()


    #DISPLAY FRAME IN A NEW WINDOW
    def show_frame(self):
        ret, frame = self.cam.read()
        if ret is True:
            cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
            img = Image.fromarray(cv2image)
            imgtk = ImageTk.PhotoImage(image=img)
            self.lmain.imgtk = imgtk
            self.lmain.configure(image=imgtk)
            self.lmain.after(10, self.show_frame)


Gui()

Я прикрепил скриншоты, когда я запускаю скрипт в python и когда я запускаю .exe python exe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...