-1

MPD のアイドル機能を使用して変更を待機し、Python を使用して GTK GUI に表示したいと考えています。問題は、MPD のアイドル機能を使用すると、GUI がブロックされて応答しなくなることです (曲を変更すると、GTK ウィンドウが応答しなくなります)。削除するself.mpd.idle()と機能しますが、関数は常に実行され続けるため、不要です。

これを解決する最善の方法は何ですか?

の最初のアプローチ:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib
from mpd import MPDClient

class GUI:
    def __init__(self):
        self.mpd = MPDClient()
        self.mpd.timeout = 10
        self.mpd.connect("localhost", 6600)

        self.window = Gtk.Window()
        self.window.connect("delete-event", Gtk.main_quit)
        self.window.show_all()

        GLib.idle_add(self.get_current_song)
        Gtk.main()

    def get_current_song(self):
        self.mpd.idle()
        print(self.mpd.currentsong())
        return True

app = GUI()

thisを使用した の2番目のアプローチ。それでも同じ結果が得られます。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib
from mpd import MPDClient
import threading

class GUI:
    def __init__(self):
        self.mpd = MPDClient()
        self.mpd.timeout = 1
        self.mpd.connect("localhost", 6600)

        self.window = Gtk.Window()
        self.window.connect("delete-event", Gtk.main_quit)

        self.window.show_all()
        self.thread = threading.Thread(target=self.idle_loop)
        self.thread.daemon = True
        self.thread.start()
        Gtk.main()

    def get_songs(self):
        print(self.mpd.currentsong())
        self.mpd.idle()
        return True

    def idle_loop(self):
        GLib.idle_add(self.get_songs)

app = GUI()

WORKINGGLib.idle_add()関数を 除外することが解決策のようです。しかし、これが「適切な」方法であるかどうかはわかりません。GLib.idle_add()ドキュメントに記載されているので、なぜそれを台無しにして使用しないのかわからないのは気分が悪いです。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib
from mpd import MPDClient
import threading

class GUI:
    def __init__(self):
        self.mpd = MPDClient()
        self.mpd.timeout = 1
        self.mpd.connect("localhost", 6600)

        self.window = Gtk.Window()
        self.window.connect("delete-event", Gtk.main_quit)

        self.window.show_all()
        self.thread = threading.Thread(target=self.get_songs)
        self.thread.daemon = True
        self.thread.start()
        Gtk.main()

    def get_songs(self):
        self.mpd.idle()
        print(self.mpd.currentsong())

app = GUI()
4

1 に答える 1

0

Let us use the threading module here. As described in this article : https://pygobject.readthedocs.io/en/latest/guide/threading.html, we can make the following code:

import gi
from threading import Thread
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib
from mpd import MPDClient

class GUI:
    def __init__(self):
        self.mpd = MPDClient()
        self.mpd.timeout = 10
        self.mpd.connect("localhost", 6600)

        self.window = Gtk.Window()
        self.window.connect("delete-event", Gtk.main_quit)
        self.window.show_all()

        thread = Thread(target=self.get_current_song, args=())
        thread.start()
        Gtk.main()

    def get_current_song(self):
        self.mpd.idle()
        print(self.mpd.currentsong())
        return True

app = GUI()
于 2020-01-29T15:43:24.933 に答える