带有 QTimer 的 PyQt5 应用程序中的地图上的标记不更新

问题描述 投票:0回答:1

我正在构建一个用户界面,将一些随机值放在一些图形中,并在地图中随机添加一些标记。这是代码:

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QHBoxLayout
from PyQt5.QtCore import QTimer
from classes.MapViewWidget import MapView
from classes.RawDataWidget import RawDataWidget
from classes.TemperatureGraphWidget import TemperatureGraph
from classes.ArduinoThread import ArduinoThread
import random


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setWindowTitle("Ground Control")

        # Create the widgets for the temperature and pressure graphs, the map, and the raw data
        self.map_view = MapView(self)
        self.temperature_graph = TemperatureGraph(self)
        self.pressure_graph = TemperatureGraph(self)
        self.raw_data_view = RawDataWidget(self)

        # Create a horizontal layout for the temperature and pressure graphs
        temperature_pressure_layout = QHBoxLayout()
        temperature_pressure_layout.addWidget(self.temperature_graph)
        temperature_pressure_layout.addWidget(self.pressure_graph)

        temperature_pressure_layout.setSpacing(0)  # Set spacing to zero

        # Create layout for all the widgets
        grid_layout = QGridLayout()

        # Every widget take up 1/2 of the raw
        grid_layout.setColumnStretch(0, 2)
        grid_layout.setColumnStretch(1, 2)

        grid_layout.addWidget(self.temperature_graph, 0, 0, 1, 1)
        grid_layout.addWidget(self.map_view, 0, 1, 1, 1)
        grid_layout.addWidget(self.pressure_graph, 1, 0, 1, 1)
        grid_layout.addWidget(self.raw_data_view, 1, 1, 1, 1)

        grid_layout.setSpacing(0)  # Set spacing to zero
        grid_layout.setContentsMargins(0, 0, 0, 0)  # Set margins to zero

        # Create a central widget and set the grid layout
        central_widget = QWidget()
        central_widget.setLayout(grid_layout)
        self.setCentralWidget(central_widget)

        # set timer of 1 sec
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_data)
        self.timer.start(1000)

    def update_data(self):

        latitude = random.uniform(12.0, 13.0)
        longitude = random.uniform(77.0, 78.0)
        self.map_view.add_marker(latitude, longitude)

        # update graph values randomly
        raw_text = ""
        for i in range(0, 10):
            rnd_num = random.randint(10, 24)
            raw_text += "Temperature value: " + \
                str(rnd_num) + "°C --- Time: " + str(i) + "s\n"
            self.temperature_graph.update(rnd_num, i)
            self.raw_data_view.set_data(raw_text)


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

这是 MapView 类的代码:

from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebChannel import QWebChannel


class MapView(QWebEngineView):
    def __init__(self, parent=None):
        super(MapView, self).__init__(parent)
        self.web_channel = QWebChannel(self.page())
        self.page().setWebChannel(self.web_channel)

        # Load the HTML page
        self.load(QUrl.fromLocalFile(
            "./ground_control/map/map.html"))

        # Wait for the page to finish loading before initializing the map
        self.loadFinished.connect(self.initialize_map)

    def initialize_map(self):
        self.page().runJavaScript("initializeMap();")
    
    #add the marker to the map by calling js function
    def add_marker(self, latitude, longitude):
        self.page().loadFinished.connect(lambda: self.page().runJavaScript(
            f"addMarker({latitude}, {longitude});"))

问题是这段代码没有将标记添加到地图,但是我尝试以这种方式更改代码,替换:

        # set timer of 1 sec
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_data)
        self.timer.start(1000)

与:

        self.update_data()

而且效果很好,我不明白为什么。我该怎么做才能解决这个问题?

python user-interface pyqt5 openstreetmap
1个回答
0
投票

我明白了问题出在哪里,在 MapView 类中,有一个函数:

    def add_marker(self, latitude, longitude):
       self.page().loadFinished.connect(lambda: self.page().runJavaScript(
        f"addMarker({latitude}, {longitude});"))

我在以前版本的应用程序中需要,通过用这个替换 add_marker() 函数,它工作正常:

     def add_marker(self, latitude, longitude):
        self.page().runJavaScript(f"addMarker({latitude}, {longitude});")
© www.soinside.com 2019 - 2024. All rights reserved.