我想根据谷歌地图上点击的位置了解天气。我的代码如下。但是,我收到错误“NoneType”对象没有属性“registerObject”。 我对此错误进行了研究,但还不够。我无法解决这个问题。 我不是专业程序员。我不知道该怎么做以及做什么。 请问你能帮我吗? 预先感谢您的帮助。
....
class WeatherWidget(QWidget):
def __init__(self):
super().__init__()
self.layout = QVBoxLayout(self)
self.setGeometry(100, 100, 800, 600)
# Web tarayıcısını oluştur
self.browser = QWebEngineView()
self.browser.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)
self.layout.addWidget(self.browser)
# Hava durumu bilgilerini göstermek için etiket
self.weather_label = QLabel()
self.layout.addWidget(self.weather_label)
# Google Maps API anahtarı
# Bu kısmı kendi API anahtarınızla değiştirin.
google_maps_api_key = "AIzaSyAZ5IyeWsFNY4E78H1oFYx4mUnJijeC4Uw"
# Harita URL'sini oluştur
map_url = "https://www.google.com/maps/d/embed?mid=1LVbyUHCzWPw5VV4t1DWRKrUsof8wGyo&ehbc=2E312F&noprof=1".format(
google_maps_api_key)
# HTML içeriği
html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Weather Map</title>
<script src="{}" async defer></script>
<script>
function initMap()
{{
var map = new google.maps.Map(document.getElementById('map'),
{{
center: {{lat: 0, lng: 0}},
zoom: 2
}});
// Haritada tıklama olayını dinle
map.addListener('click', function(event)
{{
var latitude = event.latLng.lat();
var longitude = event.latLng.lng();
// Tıklanan konumu Python uygulamasına bildir
window.pywebchannel_1.emit('mapClick', latitude, longitude);
}});
}}
</script>
</head>
<body>
<div id="map" style="height: 400px; width: 100%;"></div>
</body>
</html>
""".format(map_url)
# HTML içeriğini yükle
self.browser.setHtml(html_content, QUrl("about:blank"))
# Web tarayıcısından Python'a mesaj almak için bağlantı
self.browser.page().webChannel().registerObject("pywebchannel_1", self)
# Tıklanan konumu işle
def mapClick(self, latitude, longitude):
self.getWeatherInfo(latitude, longitude)
# Hava durumu bilgilerini al
def getWeatherInfo(self, latitude, longitude):
# OpenWeatherMap API anahtarı
# Bu kısmı kendi API anahtarınızla değiştirin.
openweathermap_api_key = "1628c373efa95d37cc8de29f8c882d34"
# OpenWeatherMap API'si için istek yap
url = f"http://api.openweathermap.org/data/2.5/weather?lat={latitude}&lon={longitude}&appid={openweathermap_api_key}&units=metric"
response = requests.get(url)
data = response.json()
...
错误
'NoneType' object has no attribute 'registerObject'
表明 self.browser.page().webChannel()
正在返回 None
。这可能是因为 QWebChannel
设置不正确。这是解决该问题的简明指南:
QWebChannel
并初始化它。Copy code
from PyQt5.QtWebChannel import QWebChannel
# Inside your __init__ method:
self.channel = QWebChannel()
self.browser.page().setWebChannel(self.channel)
self.channel.registerObject("pywebchannel_1", self)
操作顺序:确保在
QWebEngineView
及其页面完全创建后初始化 Web 通道。
异步性质:
QWebEngineView
是异步的。将您的频道设置连接到页面的 loadFinished
信号,以确保其完全加载。
版本检查:如果您使用的是旧版本的 PyQt,它可能无法按预期支持
QWebChannel
。考虑更新。
调试:添加打印语句或使用调试器检查错误行之前
self.browser.page()
和self.browser.page().webChannel()
的状态。
安全:避免公开共享 API 密钥。始终在共享代码中删除或混淆它们。
通过确保正确的初始化并考虑
QWebEngineView
的异步性质,您应该能够解决该错误。如果问题仍然存在,请考虑向 PyQt 特定资源寻求帮助。