Python 将raspberry pi蓝牙应用程序连接到GUI

Python 将raspberry pi蓝牙应用程序连接到GUI,python,user-interface,bluetooth,raspberry-pi,Python,User Interface,Bluetooth,Raspberry Pi,我有一个蓝牙脚本,可以让我把手机里的音乐流到车里的树莓皮上。我正在尝试创建一个GUI,允许我通过屏幕上的按钮更改音乐。目前,我可以通过在控制台中键入命令(prev、pause、play、next)来更改音乐,但我希望使用带有屏幕按钮的GUI 问题 我无法将gui连接到主应用程序。gui显示,然后我没有得到音乐输出或音乐作品,但不显示gui 我已经试过了 我曾尝试使用Tkinter和guizero构建GUI(我对GUI不熟悉),但我遇到了与上面相同的问题。 我还尝试过同时构建和运行gui和蓝牙脚本

我有一个蓝牙脚本,可以让我把手机里的音乐流到车里的树莓皮上。我正在尝试创建一个GUI,允许我通过屏幕上的按钮更改音乐。目前,我可以通过在控制台中键入命令(prev、pause、play、next)来更改音乐,但我希望使用带有屏幕按钮的GUI

问题

我无法将gui连接到主应用程序。gui显示,然后我没有得到音乐输出或音乐作品,但不显示gui

我已经试过了

我曾尝试使用Tkinter和guizero构建GUI(我对GUI不熟悉),但我遇到了与上面相同的问题。 我还尝试过同时构建和运行gui和蓝牙脚本,并将gui打印命令发送到控制台,但也没有成功

蓝牙代码

import dbus, dbus.mainloop.glib, sys
from gi.repository import GLib

def on_property_changed(interface, changed, invalidated):
    if interface != 'org.bluez.MediaPlayer1':
        return
    for prop, value in changed.iteritems():
        if prop == 'Status':
            print('Playback Status: {}'.format(value))
        elif prop == 'Track':
            print('Music Info:')
            for key in ('Title', 'Artist', 'Album'):
                print('   {}: {}'.format(key, value.get(key, '')))

def on_playback_control(fd, condition):
    str = fd.readline()
    if str.startswith('play'):
        player_iface.Play()
    elif str.startswith('pause'):
        player_iface.Pause()
    elif str.startswith('next'):
        player_iface.Next()
    elif str.startswith('prev'):
        player_iface.Previous()
    return True

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    bus = dbus.SystemBus()
    obj = bus.get_object('org.bluez', "/")
    mgr = dbus.Interface(obj, 'org.freedesktop.DBus.ObjectManager')
    for path, ifaces in mgr.GetManagedObjects().iteritems():
        adapter = ifaces.get('org.bluez.MediaPlayer1')
        if not adapter:
            continue
        player = bus.get_object('org.bluez',path)
        player_iface = dbus.Interface(
                player,
                dbus_interface='org.bluez.MediaPlayer1')
        break
    if not adapter:
        sys.exit('Error: Media Player not found.')

    bus.add_signal_receiver(
            on_property_changed,
            bus_name='org.bluez',
            signal_name='PropertiesChanged',
            dbus_interface='org.freedesktop.DBus.Properties')
    GLib.io_add_watch(sys.stdin, GLib.IO_IN, on_playback_control)
    GLib.MainLoop().run()
使用guizero的简单GUI代码

from guizero import App, PushButton

app = App()

def prev():
    print("prev")

prev_button = PushButton(app, command=prev, text="PREV")

app.display()

蓝牙源代码

主要问题似乎是两者都有自己的事件循环-
mainloop()
display()
,这两个循环都会阻止所有代码。如果跳过
mainloop().run()
并直接使用
command=player\u iface.Previous
我尝试过不使用,它会产生错误player\u iface not defined我做了一些调整。我需要添加除油嘴滑舌之外的所有代码。Mainloop()。在gui脚本中运行()。这让我可以调用player\u iface methods。看起来主要的问题是它们都有自己的事件循环-
mainloop()
display()
,这会阻止所有代码。如果跳过
mainloop().run()
并直接使用
command=player\u iface.Previous
我尝试过不使用,它会产生错误player\u iface not defined我做了一些调整。我需要添加除油嘴滑舌之外的所有代码。Mainloop()。在gui脚本中运行()。这让我可以调用player\u iface方法