属性错误:“NoneType”对象在PyQt中没有属性“registerObject”

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

我想根据谷歌地图上点击的位置了解天气。我的代码如下。但是,我收到错误“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()
...
pyqt5 pyqt4
1个回答
0
投票

错误

'NoneType' object has no attribute 'registerObject'
表明
self.browser.page().webChannel()
正在返回
None
。这可能是因为
QWebChannel
设置不正确。这是解决该问题的简明指南:

  1. 导入并初始化 QWebChannel:确保您已从 PyQt 导入
    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)
  1. 操作顺序:确保在

    QWebEngineView
    及其页面完全创建后初始化 Web 通道。

  2. 异步性质

    QWebEngineView
    是异步的。将您的频道设置连接到页面的
    loadFinished
    信号,以确保其完全加载。

  3. 版本检查:如果您使用的是旧版本的 PyQt,它可能无法按预期支持

    QWebChannel
    。考虑更新。

  4. 调试:添加打印语句或使用调试器检查错误行之前

    self.browser.page()
    self.browser.page().webChannel()
    的状态。

  5. 安全:避免公开共享 API 密钥。始终在共享代码中删除或混淆它们。

通过确保正确的初始化并考虑

QWebEngineView
的异步性质,您应该能够解决该错误。如果问题仍然存在,请考虑向 PyQt 特定资源寻求帮助。

© www.soinside.com 2019 - 2024. All rights reserved.