Как вернуть значение из функции виджета и передать его функции другого виджета в Tkinter, Python - PullRequest
0 голосов
/ 29 января 2019

Я создаю простой графический интерфейс, включающий две кнопки.Первая кнопка предназначена для выбора видеофайла, а вторая кнопка получает путь к видеофайлу и затем воспроизводит его (используя OpenCV).

Проблема в том, что я не могу вернуть путь к файлу из функции привязки первой кнопки и передать его во функцию привязки второй кнопки.

Я определил «имя файла» как глобальную переменную, но все же «имя файла» не определено в функции «PlayVideo ()».

Ниже приведен мой код:

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox

global filename


def OpenFile():
    filename =  filedialog.askopenfilename(title = "Select file",filetypes = ( ("MP4 files","*.mp4"), ("WMV files","*.wmv"), ("AVI files","*.avi") ))
    print(filename)


def PlayVideo():
    try:
        import cv2

        cap = cv2.VideoCapture(filename)

        while(cap.isOpened()):

            ret, frame = cap.read()

            cv2.imshow('frame', frame)

            if cv2.waitKey(25) & 0xFF == ord('q'):
                break
        cap.release()
        cv2.destroyAllWindows()

    except:
        messagebox.showinfo(title='Video file not found', message='Please select a video file.')


root = Tk()

selectButton = Button(root, text = 'Select video file', command=OpenFile)
playButton = Button(root, text = 'Play', command=PlayVideo)

selectButton.grid(row=0)
playButton.grid(row=1)

root.mainloop()   

Когда я выбираю видеофайл, его путь печатается.Но.когда я нажимаю кнопку воспроизведения, появляется сообщение об ошибке (выберите видеофайл).

1 Ответ

0 голосов
/ 29 января 2019

Вам необходимо добавить эту строку в начале обеих функций OpenFile и PlayVideo

global filename

Когда вы добавляете эту строку, ваша программа знает, что вместо создания / использования локальной переменной "имя файла "в этой функции, он должен использовать глобальную переменную" имя файла ".

ОБНОВЛЕНИЕ:

Чтобы избежать использования глобальных переменных, вы можете использовать изменяемый тип, как этот.

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox

def OpenFile(file_record):
    file_record['video1'] =  filedialog.askopenfilename(title = "Select file",filetypes = ( ("MP4 files","*.mp4"), ("WMV files","*.wmv"), ("AVI files","*.avi") ))
    print(file_record['video1'])

def PlayVideo(file_record):

    try:
        import cv2
        cap = cv2.VideoCapture(file_record['video1'])

        while(cap.isOpened()):
            ret, frame = cap.read()
            cv2.imshow('frame', frame)
            if cv2.waitKey(25) & 0xFF == ord('q'):
                break

        cap.release()
        cv2.destroyAllWindows()

    except:
        messagebox.showinfo(title='Video file not found', message='Please select a video file.')


root = Tk()
filename_record = {}
selectButton = Button(root, text = 'Select video file', command=lambda: OpenFile(filename_record))
playButton = Button(root, text = 'Play', command=lambda: PlayVideo(filename_record))

selectButton.grid(row=0)
playButton.grid(row=2)

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