当小部件窗口被带到前面时运行一个功能?

时间:2017-04-17 04:25:17

标签: python pyqt pyqt5

我正在为一个我正在研究的项目构建一个gui前端,而且我在查找PyQT的这个特定方面时遇到了麻烦。很久以前我有一个帖子,我认为它可以解决问题,但我找不到它。

无论如何,我分别有以下文件,main.py和playlistcreator.py:

(main.py)

import getpass
import playlistcreator
import os
import sys
import sip

sip.setapi('QString', 2)
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


# Window class
class Window(QWidget):
    def __init__(self):  # constructor for Window (passes "self" -aka Window- to __init__ to initialize it)
        super(Window, self).__init__()  # inherits from QMainWindow
        self.setGeometry(50, 50, 300, 150)  # Set window dimensions
        self.setWindowTitle("Google Music Playlist Transfer")  # Set window title
        self.setWindowIcon(QIcon('gmusic.png'))  # Set window icon

        self.login = QWidget()  # login widget ("front page")
        self.processing = QWidget()  # on successful login - being processing data
        self.file_inputs = QWidget()  # after processing, ask user where they would like to store data

        # call functions
        self.loginUI()
        self.processingUI()
        self.file_inputsUI()

        # create stacked widget and add layouts to stack
        self.Stack = QStackedWidget(self)
        self.Stack.addWidget(self.login)
        self.Stack.addWidget(self.processing)
        self.Stack.addWidget(self.file_inputs)

        main_box = QHBoxLayout(self)
        main_box.addWidget(self.Stack)

        self.setLayout(main_box)
        self.show()

    def loginUI(self):
        # Set email field
        self.email = QLineEdit()
        self.email.setMaxLength(110)
        self.email.setAlignment(Qt.AlignLeft)

        # Set password field
        self.pwd = QLineEdit()
        self.pwd.setAlignment(Qt.AlignLeft)
        self.pwd.setEchoMode(QLineEdit.Password)

        # Form layout
        form_layout = QFormLayout()
        form_layout.addRow("Email: ", self.email)
        form_layout.addRow("Password: ", self.pwd)

        # Login button
        self.login_btn = QPushButton("Login", self)  # login button
        self.login_btn.clicked.connect(self.process_login)  # tell button what to do
        self.login_btn.resize(self.login_btn.sizeHint())

        # Quit button
        self.quit_btn = QPushButton("Exit", self)  # exit button
        self.quit_btn.clicked.connect(self.close_application)  # tell button what to do

        # Error label layout
        self.error_layout = QHBoxLayout()

        # Button box layout
        button_box = QHBoxLayout()
        button_box.addStretch(1)
        button_box.addWidget(self.login_btn)
        button_box.addWidget(self.quit_btn)

        # input layout (main layout for "home")
        input_box = QVBoxLayout()
        input_box.addLayout(self.error_layout)
        input_box.addLayout(form_layout)
        input_box.addLayout(button_box)
        self.login.setLayout(input_box)

    def processingUI(self):
        # setup layout
        layout = QHBoxLayout()
        # alert user that we're grabbing track data
        self.progress_label = QLabel("Grabbing tracks from Google Music. . .")
        self.progress_label.setStyleSheet("color: rgb(0, 100, 0);")
        layout.addWidget(self.progress_label)

        # Get users list of "thumbs up" tracks from Google Music

        # set layout
        favorite_tracks = self.get_tracks
        self.processing.setLayout(layout)

    def file_inputsUI(self):
        layout = QFormLayout()
        # Set text field for directory
        self.dir_textbox = QTextEdit(self)
        # Add textbox to layout
        layout.addRow("Music Directory: ", self.dir_textbox)
        self.file_inputs.setLayout(layout)

    def close_application(self):
        confirm = QMessageBox.question(self, 'Exit Confirmation',
                                       "Are you sure you want to exit?",
                                       QMessageBox.Yes | QMessageBox.No)
        if confirm == QMessageBox.Yes:
            sys.exit()
        else:
            pass

    def process_login(self):
        email_input = str(self.email.text())
        pwd_input = str(self.pwd.text())
        login_successful = playlistcreator.login(email_input, pwd_input)
        if login_successful:
            self.Stack.setCurrentIndex(1)
        else:
            self.error_label = QLabel("Please check your email/password!")
            self.error_label.setStyleSheet("color: rgb(255, 0, 0);")
            self.error_layout.addWidget(self.error_label)

    def get_tracks(self):
        tracks = playlistcreator.get_favorite_tracks()
        print("You have ", len(tracks), " favorite tracks!")
        return tracks

    # def open_dir_dialog(self):
    #     directory = QFileDialog.getExistingDirectory(self, 'Select USB Drive Location')
    #     self.myTextBox.setText(fileName)


def main():
    # Create an PyQT5 application object.
    app = QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

    # # Input Music Directory
    # music_dir = input("Please put the path to your music folder: ")
    # list_of_paths = playlistcreator.findmp3(music_dir, favorite_tracks)
    # # Input playlist file save location
    # playlist_path = input("Where would you like to save the playlist?: ")
    # playlist_name = input("What would you like to name the playlist? ")
    # playlist_name += ".m3u8"
    # # Testing appending file extension to string
    # playlistcreator.addtoplaylist(list_of_paths, playlist_path, playlist_name)
    # playlistcreator.logout()


main()

(playlistcreator.py)

import os
from gmusicapi import Mobileclient
from mutagen.easyid3 import EasyID3

api = Mobileclient()
songCount = 0
favorite_files_path = []
logged_in = False


def login(email, password):
    library = []
    if "@" not in email:
        email += "@gmail.com"
    logged_in = api.login(email, password, Mobileclient.FROM_MAC_ADDRESS)
    return logged_in


def get_favorite_tracks():
    print("Getting songs from Google Music. . .")
    library = api.get_all_songs()
    print("There are", len(library), "items in your music library")
    good_songs = [song for song in library if song['rating'] == '5']
    print("You have", len(good_songs), "favorite tracks!")
    return good_songs


def logout():
    api.logout()


def findmp3(rootFolder, favoriteTracks):
    print("Searching for favorite tracks. . .")
    for directory, subdirectory, files in os.walk(rootFolder, topdown=False):  # for all files in directory
        global songCount
        global favorite_files_path
        for mp3 in files:  # for files in 
            if mp3.endswith(".mp3"):  # if file ends with .mp3
                file_path = os.path.join(directory, mp3)  # concatenate to create full path
                try:
                    file_tags = EasyID3(file_path)  # grab file tags from mp3 file
                except:
                    file_tags = EasyID3()  # create tags if none are found
                    file_tags.save(file_path)  # save file to have new tags
                if "title" in file_tags:
                    fileTitle = file_tags["title"][0]  # TIT2 = corresponding tag in mutagen for song title
                else:
                    fileTitle = "None"
                if "artist" in file_tags:
                    fileArtist = file_tags["artist"][0]  # TPE = corresponding tag in mutagen for artist
                else:
                    fileArtist = "None"
                if "album" in file_tags:
                    fileAlbum = file_tags["album"][0]  # TALB = corresponding tag in mutagen for album
                else:
                    fileAlbum = "None"
                for track in favoriteTracks:
                    gMusicTitle = track["title"]
                    gMusicArtist = track["artist"]
                    gMusicAlbum = track["album"]
                    if fileTitle in gMusicTitle and fileArtist in gMusicArtist and fileAlbum in gMusicAlbum:  # if file tags (artist, album, title) match gMusic tags
                        songCount += 1
                        if songCount == 1:
                            print("Found 1 song")
                        else:
                            print("Found", songCount, "songs")  # print updated count of found tracks
                        favorite_files_path.append(file_path)  # add all found files to a list (via their paths)
                        break  # break out of "for track in favorite tracks"
    return favorite_files_path


def addtoplaylist(paths, playlist_path, playlist_name):
    # Open file (or create if it does not exist)
    # change to given directory
    try:
        os.chdir(playlist_path)
    except Exception as err:
        print(err)
    # open file - if it does not exist, create it
    with open(playlist_name, 'a+', encoding="UTF-8") as playlistFile:
        print("Adding tracks...", end="")
        for track in paths:
            print(".", end="")
            playlistFile.write(track + '\n')
    playlistFile.close()

我遇到的问题是,当用户登录时,他们点击了进入处理窗口(显示该程序正在抓取来自Google的所有曲目)但实际上似乎并没有运行get_tracks()方法(这实际上是用户从谷歌获得的曲目),因为该程序挂起并且没有做任何事情。

我已经使用直接命令行在没有GUI的情况下测试了程序,并且它运行完美,但我不确定GUI的问题是什么 - 我是否需要将执行线程开始正确的"窗口"被带到前线?

0 个答案:

没有答案