Превышена максимальная глубина рекурсии подпроцесса - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь получить текущее название дорожки воспроизведения из заголовка окна приложения Spotify для настольного компьютера с помощью подпроцесса.В общем, мой код работает.Но при попытке получить название песни каждые пять секунд, я получаю RecursionError.В чем проблема?

Code1

def title_of_window(self,window_class):
    """
        Retrieves the title of application by through 'subprocess'.

        Params:
            window_class (string) -- name of the application to be taken the title
                ex. --> spotify
                    --> filezilla
                    --> putty
                    --> atom

        For this app:
            - window_class parameter must be equal to "spotify"
            - Retrieves the current playing song name from Spotify.

    """
    # Finds id of all GUI apps who running.
    # Ex. -> ['0x200000a', '0x3800007', '0x4800001', '0x2e00010', '0x3600001\n']
    active_windows = subprocess.Popen(["xprop",
                                       "-root",
                                       "_NET_CLIENT_LIST_STACKING"],
                                       stdout=subprocess.PIPE).communicate()
    active_windows_ids = active_windows[0].decode("utf-8").split("# ")[1].split(", ")
    #
    # Sends all ids to 'xprop -id' and checks. If app name equal to window_class parameter, return title of this app.
    # Ex. -> get_window.py — ~/Desktop/projects — Atom
    for active_id in active_windows_ids:
        window = subprocess.Popen(["xprop",
                                    "-id",
                                    active_id.strip(),
                                    "WM_CLASS",
                                    "_NET_WM_NAME"],
                                    stdout=subprocess.PIPE).communicate()
        window = window[0].decode("utf-8").split('"')
        if window_class == window[3].lower():
            return window[5]

Mainloop

def run(self):
    song = self.title_of_window(self.SPOTIFY)
    if self.temp_song_name != song:
        lyric = self.get_lyric(song)
        self.add_lyric_to_tk(song,lyric)
    else:
        self.add_lyric_to_tk(song, "Not Found")
    self.top.after(5000,self.run)
    self.top.mainloop()

Ошибка:

File "spotifyLyric.py", line 137, in run
    song = self.title_of_window(self.SPOTIFY)
File "spotifyLyric.py", line 51, in title_of_window
    stdout=subprocess.PIPE).communicate()
RecursionError: maximum recursion depth exceeded while calling a Python object

1 Ответ

0 голосов
/ 17 ноября 2018

Проблема в том, что вы звоните self.top.mainloop() несколько раз.Вы должны быть в состоянии исправить ошибку, переместив вызов на self.top.mainloop() в ваш метод __init__().

def __init__(self):
    ...
    self.run()
    self.top.mainloop()

def run(self):
    song = self.title_of_window(self.SPOTIFY)
    if self.temp_song_name != song:
        lyric = self.get_lyric(song)
        self.add_lyric_to_tk(song,lyric)
    else:
        self.add_lyric_to_tk(song, "Not Found")
    self.top.after(5000,self.run)

Решает ли это вашу проблему?

РЕДАКТИРОВАТЬ: см. здесь для более подробного описания проблемы.

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