TypeError: 'Weather' object is not callable

TypeError: 'Weather' object is not callable

我是编程新手,所以如果我缺少正确的术语,请原谅。

我正在尝试从网站检索图像,然后 post 使用 tkinter 将其放到 GUI 上。它可以工作,因为它 post 是 GUI 上的图像;但是它仍然会根据此 post.

的标题产生错误

导致错误的代码部分如下:

    raw_data = BeautifulSoup(urllib.request.urlopen("http://www.weather.com.au/act/canberra").read())
    image = raw_data("img", ("class", "si"))[0]
    image = image["src"]
    if image == ("/images/icons/5.gif"):
        URL = urllib.request.urlopen("http://www.weather.com.au/images/icons/5.gif").read()
        b64_data = base64.encodestring(URL)
        image = PhotoImage(data = b64_data)
        label = Label(self, image = image).grid(row = 1, column = 2)
        self(image)

进一步缩小范围,似乎第 39 行导致了错误。

self(image)

完整节目如下:

#!/usr/bin/env python
from tkinter import *
import sys
import urllib.request
from urllib.request import urlopen
import base64
from bs4 import BeautifulSoup

class Weather(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.configure(bg = "#ededed")
        self.grid()
        self.heading = Label(self, bg = "#ededed", text = "       Temperature      ").grid(row = 0, column = 1, pady = 5)
        self.heading = Label(self, bg = "#ededed", text = "        Picture        ").grid(row = 0, column = 2, pady = 5)

        button = Button(self, bg = "#ededed", text = "Canberra", command = self.canberra_data).grid(row = 3, column = 0, sticky = EW)

        self.obsVar1 = StringVar()
        label = Label(self, textvariable = self.obsVar1, bg = "#e5e5e5", fg = "#751974").grid(row = 1, column = 1)
        self.obsVar1.set("")

    def canberra_data(self):
        soup = BeautifulSoup(urllib.request.urlopen("http://www.bom.gov.au/act/observations/canberra.shtml").read())
        table = soup.find("table", {"id" : "tCANBERRA"}).tbody("tr", "rowleftcolumn")
        for row in soup("th", {"id" : "obs-station-canberra"}):
            for temp in soup("td", {"headers" : "obs-temp obs-station-canberra"}):                                                                       
               self.obsVar1.set(temp.text)

        raw_data = BeautifulSoup(urllib.request.urlopen("http://www.weather.com.au/act/canberra").read())
        image = raw_data("img", ("class", "si"))[0]
        image = image["src"]
        if image == ("/images/icons/5.gif"):
            URL = urllib.request.urlopen("http://www.weather.com.au/images/icons/5.gif").read()
            b64_data = base64.encodestring(URL)
            image = PhotoImage(data = b64_data)
            label = Label(self, image = image).grid(row = 1, column = 2)
            self(image)

master = Tk()
master.title("Weather Program")
app = Weather(master)
master.mainloop()

我要补充一点,如果网站更新了它的图片并且它不再是“5.gif”(很有可能是天气图标),那么图片将不会显示。

如有任何帮助或指导,我们将不胜感激。我看了高处和低处,但无济于事。提前谢谢你。

包含 self(image) 的行不正确。 'self' 不是 class,它是一个对象。所以,如果你想创建一个 Weather 类型的对象并将一些东西传递给它的构造函数,只需调用 Wea​​ther(image).

您不能像调用函数那样调用对象。当您在代码中说 self(image) 时,您正在尝试调用该对象。如果你想这样做,你需要实现 __call__ 方法。但是,我已经对您的示例进行了编码并对其进行了更改。请运行吧。希望对你有帮助

#!/usr/bin/env python
from tkinter import *
import sys
import urllib.request
from urllib.request import urlopen
import base64
from bs4 import BeautifulSoup

class Weather(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.configure(bg = "#ededed")
        self.grid()
        self.heading = Label(self, bg = "#ededed", text = "       Temperature      ").grid(row = 0, column = 1, pady = 5)
        self.heading = Label(self, bg = "#ededed", text = "        Picture        ").grid(row = 0, column = 2, pady = 5)

        button = Button(self, bg = "#ededed", text = "Canberra", command = self.canberra_data).grid(row = 3, column = 0, sticky = EW)

        self.obsVar1 = StringVar()
        label = Label(self, textvariable = self.obsVar1, bg = "#e5e5e5", fg = "#751974").grid(row = 1, column = 1)
        self.obsVar1.set("")

    def canberra_data(self):
        soup = BeautifulSoup(urllib.request.urlopen("http://www.bom.gov.au/act/observations/canberra.shtml").read())
        table = soup.find("table", {"id" : "tCANBERRA"}).tbody("tr", "rowleftcolumn")
        for row in soup("th", {"id" : "obs-station-canberra"}):
            for temp in soup("td", {"headers" : "obs-temp obs-station-canberra"}):
               self.obsVar1.set(temp.text)

        raw_data = BeautifulSoup(urllib.request.urlopen("http://www.weather.com.au/act/canberra").read())
        image = raw_data("img", ("class", "si"))[0]
        image = image["src"]
        if image == ("/images/icons/5.gif"):
            URL = urllib.request.urlopen("http://www.weather.com.au/images/icons/5.gif").read()
            b64_data = base64.encodestring(URL)
            image = PhotoImage(data = b64_data)
            label = Label(self, image = image)
            label.image = image
            label.grid(row=1,column=2)

master = Tk()
master.title("Weather Program")
app = Weather(master)
master.mainloop()

你我的版本差异如下:

<             label = Label(self, image = image).grid(row = 1, column = 2)
<             self(image)
---
>             label = Label(self, image = image)
>             label.image = image
>             label.grid(row=1,column=2)