Встроить Navit в Kivy Screen
После некоторых проблем с разными фреймворками я начал работать с Kivy над своим настоящим проектом. Некоторые части сейчас работают нормально, и я приступаю к реализации других функций шаг за шагом.
Я новичок в Python и не совсем уверен, какой фреймворк мне выбрать. Я надеюсь, что есть решение в том пути, которым я сейчас иду. В противном случае мне пришлось бы начинать с самого начала.
Фактическая проблема в том, что я пытаюсь встроить Navit как собственное окно на переднем плане перед моим графическим интерфейсом. Я читал о многих примерах кода, но большинство из них - это просто фрагменты реального кода. Любой из них основан на PyQt4. Прежде всего, я не могу установить PyQt4 с PyCharm, но могу установить PyQt5. В этой версии я сначала попытался получить что-то от Navit на свой экран, но я действительно не знаю, с чего начать.
В своем коде я попытался встроить собственный код внедрения Navit в свой Kivy ScreenApp Funktion, но я не знаю, с чего начать. То, как я пробовал это в коде, - это запуск окна Kivy, заканчивающийся белым экраном со следующим сообщением об ошибке:
The file is loaded multiples times, you might have unwanted behaviors.
Может быть, здесь кто-нибудь сможет мне помочь.
Я говорю о следующей части кода:
from __future__ import absolute_import, division, print_function
import sys
import os
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
from kivy import Config
from subprocess import Popen
from PySide6 import *
from PyQt5 import QtCore, QtWidgets, QtWebChannel, QtNetwork
Builder.load_file('screen.kv')
status = True
class ScreenLayout(Widget):
def map_click(self):
self.ids.ButtonMap.source = 'Assets/Buttons/ButtonMap_s.png'
def map_release(self):
self.ids.ButtonMap.source = 'Assets/Buttons/ButtonMap.png'
def phone_click(self):
self.ids.ButtonPhone.source = 'Assets/Buttons/ButtonPhone_s.png'
def phone_release(self):
self.ids.ButtonPhone.source = 'Assets/Buttons/ButtonPhone.png'
def warn_click(self):
self.ids.ButtonWarn.source = 'Assets/Buttons/ButtonWarn_s.png'
def warn_release(self):
self.ids.ButtonWarn.source = 'Assets/Buttons/ButtonWarn.png'
def bib_click(self):
self.ids.ButtonBib.source = 'Assets/Buttons/ButtonBib_s.png'
def bib_release(self):
self.ids.ButtonBib.source = 'Assets/Buttons/ButtonBib.png'
def free_click(self):
self.ids.ButtonFree.source = 'Assets/Buttons/ButtonFree_s.png'
def free_release(self):
self.ids.ButtonFree.source = 'Assets/Buttons/ButtonFree.png'
def ac_click(self):
self.ids.ButtonAC.source = 'Assets/Buttons/ButtonAC_s.png'
def ac_release(self):
self.ids.ButtonAC.source = 'Assets/Buttons/ButtonAC.png'
def vol_click(self):
self.ids.ButtonVol.source = 'Assets/Buttons/ButtonMute.png'
def vol_release(self):
#check status
global status
if status:
self.ids.ButtonVol.source = 'Assets/Buttons/ButtonMute.png'
status = not status
else:
self.ids.ButtonVol.source = 'Assets/Buttons/ButtonVol.png'
status = not status
class ScreenApp(App):
def build(self):
app = QtWidgets.QApplication(sys.argv)
win = QtWidgets.QWidget()
winID = int(win.winId())
sub_win = QtGui.QWindow.fromWinId(winID)
container = QtWidgets.QWidget.createWindowContainer(sub_win)
sub_win_id = int(container.winId())
process = QtCore.QProcess(container)
os.environ['NAVIT_XID'] = str(winId)
process.startDetached("navit")
return ScreenLayout()
Window.size = (1024, 768)
if __name__ == '__main__':
ScreenApp().run()
Мой файл .kv выглядит следующим образом:
<ScreenLayout>:
RelativeLayout:
canvas.before:
Rectangle:
pos: 0,0
size: 1024, 768
source: 'Assets/Buttons/Background.png'
Rectangle:
pos: 33,635
size: 235, 98
source: 'Assets/Buttons/SpeedFrame.png'
Rectangle:
pos: 205,644
size: 49, 80
source: 'Assets/Buttons/kmh.png'
Rectangle:
pos: 33,20
size: 285, 98
source: 'Assets/Buttons/VolFrame.png'
Label:
text: '102'
pos: 75, 635
font_size: 90
font_name: 'Assets/Fonts/RedHatDisplay-Regular.ttf'
Button:
size: 98, 98
pos: 293 , 635
background_color: 0,0,0,0
on_press: root.map_click()
on_release: root.map_release()
Image:
id: ButtonMap
source: 'Assets/Buttons/ButtonMap.png'
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size: 98, 98
pos: 412 , 635
background_color: 0,0,0,0
on_press: root.phone_click()
on_release: root.phone_release()
Image:
id: ButtonPhone
source: 'Assets/Buttons/ButtonPhone.png'
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size: 98, 98
pos: 533 , 635
background_color: 0,0,0,0
on_press: root.warn_click()
on_release: root.warn_release()
Image:
id: ButtonWarn
source: 'Assets/Buttons/ButtonWarn.png'
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size: 98, 98
pos: 652 , 635
background_color: 0,0,0,0
on_press: root.bib_click()
on_release: root.bib_release()
Image:
id: ButtonBib
source: 'Assets/Buttons/ButtonBib.png'
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size: 98, 98
pos: 773 , 635
background_color: 0,0,0,0
on_press: root.free_click()
on_release: root.free_release()
Image:
id: ButtonFree
source: 'Assets/Buttons/ButtonFree.png'
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size: 40, 40
pos: 893 , 635
background_color: 0,0,0,0
on_press: root.ac_click()
on_release: root.ac_release()
Image:
id: ButtonAC
source: 'Assets/Buttons/ButtonAC.png'
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size: 40, 40
pos: 30 , 20
background_color: 0,0,0,0
on_release: root.vol_release()
on_press: root.vol_click()
Image:
id: ButtonVol
source: 'Assets/Buttons/ButtonVol.png'
center_x: self.parent.center_x
center_y: self.parent.center_y