我正在构建一个用户界面,将一些随机值放在一些图形中,并在地图中随机添加一些标记。这是代码:
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()
而且效果很好,我不明白为什么。我该怎么做才能解决这个问题?
我明白了问题出在哪里,在 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});")