module is not callable

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Queztapotel
User
Beiträge: 13
Registriert: Freitag 27. November 2009, 14:47

Hi,

Zuerst, ich hab das forum durchsucht und nichts gefunden
hier Fehlermeldung:

Code: Alles auswählen

C:\Python25\Pong>main.py
Traceback (most recent call last):
  File "C:\Python25\Pong\Main.py", line 54, in <module>
    main()
  File "C:\Python25\Pong\Main.py", line 21, in main
    ball = Ball(screen)
TypeError: 'module' object is not callable
hier mein Code:

Code: Alles auswählen

# -*- coding: UTF-8 -*-
import os, sys
import pygame
import Ball
import Leftplayer
import Rightplayer
from pygame.locals import *
from pygame.rect import *


def main():
#initalize
    pygame.init()
    screen = pygame.display.set_mode((800,600))
    pygame.display.set_caption("Pong")
    pygame.mouse.set_visible(1)
    pygame.key.set_repeat(1, 30)
    white = (255,255,255)
    width = 5
    #Create ball/players
    ball = Ball(screen)
    rightplayer = Rightplayer(screen)
    leftplayer = Leftplayer(screen)
    
    
    #show longer than one frame
    clock = pygame.time.Clock()
    
    running = 1
    while running:
        clock.tick(30)
        screen.fill((0, 0, 0))

        #Draw the playarea
        playarea = pygame.draw.polygon(screen, white, [(10, 10), (790, 10), (790, 590), (10, 590)], 5 )
        middlline = pygame.draw.line(screen, white, (400,10), (400,590), width)
        middlline.inflate_ip(width,20)
        ball.draw()
        
        
        
        for event in pygame.event.get():
            if event.type == QUIT:
                running = 0

            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.event.post(pygame.event.Event(QUIT))

        pygame.display.flip()

    
if __name__ == '__main__':
    main()


Ball.py
#Ball
import os, sys
import Main
import pygame

class Ball:
  def __init__(self,surface):
    self.surface = surface
    self.white = (255,255,255)
    self.bwidth = 3
    self.radius = 7
    
    def draw(self):
      pygame.draw.circle(surface, self.white, (400,250), self.radius, self.bwidth)
    
    #def moveball(self):
      #kommt noch
  

Leftplayer.py

#player left
import os, sys
import pygame
class Leftplayer:
  def __init__(self,surface):
    self.surface = surface
    self.width = 6
       
  def draw(self):
    leftplayer = pygame.draw.line(screen, white, (150,25), (250,25), width)
    leftplayer.inflate_ip(width,20)

Rightplayer.py

#player right
import os, sys
import pygame
class Rightplayer:
  def __init__(self,surface):
    self.surface = surface 
    self.width = 6

  def draw(self):
    rightplayer = pygame.draw.line(screen, white, (150,775), (250,775), width)
    rightplayer.inflate_ip(width,20)
Wäre seehr dankbar wenn ihr mir helfen könnten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Deutlicher kann eine Fehlermeldung doch nicht sein:
In Zeile 21 versuchst du, ein Modul (nämlich Ball, was du zuvor importiert hast) auszuführen. Das geht natürlich nicht ...
Queztapotel
User
Beiträge: 13
Registriert: Freitag 27. November 2009, 14:47

auch wenn ich danach Nr 1 Depp im Forum bin, die antwort hilft mir nicht weiter. :<
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Queztapotel hat geschrieben:auch wenn ich danach Nr 1 Depp im Forum bin
Dafür reicht das noch nicht ...

In Zeile 4 steht

Code: Alles auswählen

import Ball
Du importierst also ein Modul namens Ball.

In Zeile 21 steht

Code: Alles auswählen

ball = Ball(screen)
Das sieht aus, als würde eine Instanz einer Klasse Ball erzeugt (evtl. ist es auch das, was du vorhast), aber in Wahrheit wird hier das Modul Ball mit dem Argument screen aufgerufen - das funktioniert eben nicht.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Zuerst einmal: Module sollte man immer kleinschreiben.

Du solltest dich auf jeden Fall noch einmal mit den Grundlagen auseinander setzen, vor allem die Zusammenhänge Modul, Paket
Im Tutorial unter
http://docs.python.org/tutorial/modules.html

Unter der Voraussetzung, dass dein Modul jetzt kleingeschrieben ist, funktioniert dann folgendes

Code: Alles auswählen

#entweder
from ball import Ball
ball = Ball(screen)
#oder
import ball
ball = ball.Ball(screen)
Für jede Klasse eine Datei bzw. Modul wie in C++/Java ist in Python außerdem nicht üblich, du solltest deine Paketstruktur sowieso noch überarbeiten, dann ist dieses Problem eh irrelevant.
Queztapotel
User
Beiträge: 13
Registriert: Freitag 27. November 2009, 14:47

arrr, jetzt habe ich extra wegen nem anderem tutorial alles gross umgeschrieben^^ - naja, was solls.

Danke viel mal für die Hilfe es funktioniert :D
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Was das denn für ein Tutorial?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Queztapotel hat geschrieben:arrr, jetzt habe ich extra wegen nem anderem tutorial alles gross umgeschrieben^^ - naja, was solls.
Bei den Klassennamen ist das ja auch richtig. Aber die Modulnamen solltest du klein schreiben (dann wäre dir der Fehler oben evtl. auch gar nicht unterlaufen).
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

Hi ,

ich habe das Problem auch , aber nicht wegen fehlerhaftem Import.
Für mich scheint alles zu passen:

Code: Alles auswählen

from example_obj import exampleObj


def execute_my_obj(**kwargs):
    my_obj = exampleObj(kwargs)
    my_obj.do_something()

if __name__ == '__main__':
    kwargs = dict(sys.argv[:]])
    execute_my_obj(**kwargs)
    

pyLint sagt:
E1102: exampleObj is not callable (not-callable)

Kann jemand helfen?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@HeinzBacker: Und was passiert wenn Du das ausführst?

Also äh, nachdem Du den Fehler behoben hast der vorher auftritt natürlich. Obwohl das ja eigentlich zwei sind. Müssen beide behoben werden.

Du könntest dann auch gleich noch die Namensschreibweise an die Python-Konventionen anpassen. Und dieses unsinnige `my_` weg lassen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

es läuft ganz normal ohne Probleme.

Ist ja "nur" ein Lint Fehler - aber den will ich auch weghaben.
__blackjack__ hat geschrieben: Freitag 30. Oktober 2020, 00:15 Du könntest dann auch gleich noch die Namensschreibweise an die Python-Konventionen anpassen. Und dieses unsinnige `my_` weg lassen.
das ist kein Produktiv-Code, sonder nur hier für das Forum so umgeschrieben.
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

keine ne Idee?

Stimmt dann die Pylint Meldung?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@HeinzBacker: Woher sollen wir das wissen? Glaskugel ist gerade in Reparatur. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

die scheint dauernd in Reparatur zu sein.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

HeinzBacker hat geschrieben: Dienstag 3. November 2020, 16:59 die scheint dauernd in Reparatur zu sein.
Du könntest alternativ auch zeigen, wie der Code von example_obj aussieht, insbesondere was exampleObj dort eigentlich ist. Dann könnten wir auch ohne Glaskugel arbeiten.
Antworten