python 如何同时运行我使用PyQt5制作的界面和我使用Tkinter制作的Map程序?

t0ybt7op  于 2023-11-16  发布在  Python
关注(0)|答案(2)|浏览(127)

我正在为无人机制作一个界面。我有一个主界面,显示我从无人机套件和姿态指示器获得的数据。我使用PyQt5制作了这个主界面,首先我要直接添加一个Map到我使用PyQt5制作的这个界面,但是我使用的map不能在我在PyQt5上制作的接口上工作。所以我决定将主接口和map分开。我使用“tkintermapwiever”.当我分别运行这两个,它工作顺利和稳定.但由于我们有一个单一的工具,我们将通过同一个服务器连接,两个程序需要同时运行,我的研究没有取得任何成果.我将非常感激,如果你能帮助.谢谢..
我尝试过Threading和Processing方法,但它们是按顺序工作的,而不是同时工作的。例如,我的主界面首先打开,在我关闭我的界面后,我的Map应用程序打开。它不应该是这样的,两者应该同时并排打开。还有这个额外的问题:在下面的代码片段中,一旦我导入root.tk,Map就会自动打开。
我调用两个不同的文件并尝试多处理的代码块:

from multiprocessing import Process
from mainMap import root_tk
from mainarayüz import main

def arayuz() :
    p1 = Process(target= main())
    p2 = Process(root_tk.mainloop())
    
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == '__main__' :
    arayuz()

我设法一起运行两个应用程序,但1秒后两个应用程序冻结,没有更新自己。
我将发送代码:

from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from sarsgui_taslak import Ui_MainWindow
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtCore import QTimer
from geopy.geocoders import OpenCage
from PyQt5.QtGui import QFont,  QColor
from connecBaglanti import connect, connection_string, vehicle , VehicleMode, LocationLocal
from attitude_indicator import AttitudeIndicator
import datetime
import time
import math
import tkinter as tk
import tkintermapview
import time
import threading
import os
from PIL import Image, ImageTk
from connecBaglanti import connect, connection_string, vehicle, lat, lon
from multiprocessing import Process
 
# print("Simülatör başlatılıyor (SITL)")
# connection_string = "tcp:127.0.0.1:5762"
 
# print("Araç şurada bağlanıyor: %s" % (connection_string,))
# vehicle = connect(connection_string, wait_ready=False)
# # lat = vehicle.lsocation.global_relative_frame.lat
# lon = vehicle.location.global_relative_frame.lon
 
opencage_api_key = "52a.........................0"
 
class MainPage(QMainWindow):
    def __init__(self):
        super().__init__()
         
######MAIN INTERFACE STUFFFFFFFFFFFFFFFFFFFFFFFF
 
####################################MAP WITH TKINTER##############################################
def mapgui() :
    lat = vehicle.location.global_relative_frame.lat
    lon = vehicle.location.global_relative_frame.lon
    # create tkinter window
    root_tk = tk.Tk()
    root_tk.geometry(f"{1000}x{700}")
    root_tk.title("SarsGUI Map")
###MAP STUFFFF
    root_tk.mainloop()
 
 
     
def maingui():
    uygulama = QApplication([])
    pencere = MainPage()
    pencere.show()
    sys.exit(uygulama.exec_())
 
 
 
 
if __name__ == '__main__':
    pyqt_process = Process(target=maingui)
    tkinter_process = Process(target=mapgui)
 
    pyqt_process.start()
    tkinter_process.start()
 
    pyqt_process.join()
    tkinter_process.join()


我又在编辑了,我只有一个要求,两个程序同时运行,不管是不是一个程序写的。
下面是mainarayüz.py文件:

from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from sarsgui_taslak import Ui_MainWindow
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtCore import QTimer
from geopy.geocoders import OpenCage
from PyQt5.QtGui import QFont,  QColor
from connecBaglanti import connect, connection_string, vehicle , VehicleMode, LocationLocal
from attitude_indicator import AttitudeIndicator
import datetime
import time
import math

opencage_api_key = "5............0"

class MainPage(QMainWindow):
   def __init__(self):
       super().__init__()
       ####stufstufffffff
   def modechange(self, nowmode) :
       ####stufstufffffff

   def rebootcom(self) :
       ####stufstufffffff
   def armcom(self) :
       ####stufstufffffff
   def disarmcom(self) :
       ####stufstufffffff
   def updatearm(self) :
       ####stufstufffffff

   
   def go_right(self) :
       ####stufstufffffff
   def go_left(self) :
       ####stufstufffffff

   def go_forward(self) :
       ####stufstufffffff
   def go_backward(self) :
       ####stufstufffffff
       time.sleep(0.5)
       ####stufstufffffff



   def update_location_and_marker(self):
       ####stufstufffffff
       
   def updatePitch(self, pitch):
       ####stufstufffffff
   def updateRoll(self, roll):
       ####stufstufffffff
   def update(self):
       ####stufstufffffff
   
def main():
   uygulama = QApplication([])
   pencere = MainPage()
   pencere.show()
   sys.exit(uygulama.exec_())

if __name__ == "__main__":
   main()


以下是mainMap.py文件:

import tkinter
import tkintermapview
import time
import threading
import os
from PIL import Image, ImageTk
from connecBaglanti import connect, connection_string, vehicle, lat, lon
lat = vehicle.location.global_relative_frame.lat
lon = vehicle.location.global_relative_frame.lon
root_tk = tkinter.Tk()
root_tk.geometry(f"{1000}x{700}")
root_tk.title("SarsGUI Map")
#############stufstufffffff

def clear_previous_marker():
    #############stufstufffffff

# Konum güncelleme iş parçacığını başlatın
def update_position():
    #############stufstufffffff
    while True:
        #############stufstufffffff

#############stufstufffffff

root_tk.mainloop()


这是尝试同时打开mapwithGUI.py文件和mainMap.py文件的 interface.py文件:

import subprocess
import time
import os

def run_two():
    
    p1 = subprocess.Popen(["python", "mainarayüz.py"])
    p2 = subprocess.Popen(["python", "mainMap.py"])

    while True:
        if p1.poll() is not None:
            p2.terminate()
            break
        elif p2.poll() is not None:
            p1.terminate()
            break
        time.sleep(1.0)

    p1.wait(1.0)
    p2.wait(1.0)
    print("Tamamlandı")

if __name__ == "__main__":
    run_two()


在mapwithGUI.py文件中,我试图使它们同时工作,但首先出现Map(mainMap.py),在我关闭它之后,出现接口(maininterface.py)。如果我不关闭Map,接口就不会出现。
最后编辑:
我在mainMap.py和maininterface.py中都使用的dronekit库,在那里我将Map和接口连接到无人机(也许这就是问题所在):

from dronekit import Command, connect, VehicleMode, LocationGlobalRelative, LocationLocal,__init__

# print("Simülatör başlatılıyor (SITL)")
connection_string = "tcp:127.0.0.1:5762"

print("Araç şurada bağlanıyor: %s" % (connection_string,))
vehicle = connect(connection_string, wait_ready=False)


https://drive.google.com/file/d/1OC-JwTG01P_whg_fw_FkKstUIEjtlm7F/view

ctehm74n

ctehm74n1#

应该可以在不同的程序中运行这两个GUI,我不知道你在多处理中具体尝试了什么,但这确实是一种可以运行的方法。
没有什么好的方法可以让它在一个程序中工作。每个工具包都需要控制GUI事件的队列,以便做出适当的响应。原则上,用某种Map来桥接这些事件是可能的,但我不知道有任何现有的机制可以做到这一点,如果有可能的话,那么它肯定比你个人想要的要多得多。

qij5mzcb

qij5mzcb2#

我对你的问题有点困惑,因为你一直坚持说你无意将两个合并组合成一个程序,但在你的代码中你却试图这样做。你没有回应我的评论,我问你为什么不能简单地同时运行两个程序,使用标准的操作系统方法。根据你提供的代码,你的两个程序之间没有任何交互,所以没有特别的原因为什么它们必须从同一个Python脚本启动。然而,抛开所有这些,再次为我可能的误解道歉,这里有一个想法给你:
第一步是将PyQt程序与TkInter程序分离。将它们的入口点放在两个不同的文件中,这样它们实际上是两个完全独立的程序。它们对彼此一无所知。
步骤2是使用子进程模块中的方法从同一Python脚本启动两个程序。
这里有一个例子来说明你是如何做到这一点的。在我的例子中,两个程序都是tkinter程序,但这并不重要。有三个文件涉及。第一个是a4a.py:

import tkinter as tk
import random

def test_gui():
    root_tk = tk.Tk()
    root_tk.geometry(f"{1000}x{700}")
    root_tk.title(f"Test program {random.random()}")
    root_tk.mainloop()

if __name__ == "__main__":
    test_gui()

字符串
它看起来有点像你的mapgui()程序。a4b.py

import tkinter as tk
import random

def test_gui():
    root_tk = tk.Tk()
    root_tk.geometry(f"{1000}x{700}")
    root_tk.title(f"Test program {random.random()}")
    root_tk.mainloop()

if __name__ == "__main__":
    test_gui()


这是完全相同的代码,因为这只是为了说明。我在窗口标题中放置了一个随机数字,以便区分它们。在您的情况下,一个是tkinter程序,另一个是PyQt5程序。
下面是第三个文件,a4.py:

import subprocess
import time

def run_two():
    p1 = subprocess.Popen(["python3.11", "a4a.py"])
    p2 = subprocess.Popen(["python3.11", "a4b.py"])
    while True:
        if p1.poll() is not None:
            p2.terminate()
            break
        elif p2.poll() is not None:
            p1.terminate()
            break
        time.sleep(1.0)
    p1.wait(1.0)
    p2.wait(1.0)
    print("Finished")

if __name__ == "__main__":
    run_two()


这个脚本启动另外两个程序,并每秒检查一次,看看它们中的任何一个是否已经终止。如果是,脚本终止另一个并退出。
我希望这是你正在寻找的。

相关问题