

Python初心者です。  
Pythonで作成したプログラム（簡単な計算/mahjongライブラリ）をbottleフレームワークを使用してWEBブラウザに表示したいと考えています。

※一部修正しました

## 実行環境

Python3.8以上  
bottle 0.12.19  
mahjong 1.1.11

## ディレクトリ

project  
├views  
│ ├index.html  
│ └mahjong.html  
└main.py

"localhost:8080/"に表示されているサブミットを押下したら、"localhost:8080/mahjong"のページ移動するようにしていますが、main.pyで実行している計算結果（print_hand_result(result)）がNoneと表示されてしまっています。（main.py）を実行したあと、起動するIDLEには計算結果が表示されています。

ブラウザ上にresultのみを表示した場合は結果が表示されるので、print_hand_resultが表示できていないことまでは分かっています。

（print_hand_result(result)）を表示できるようにしたいのですが、どのようにしたらよいでしょうか。  
ご教授お願い致します。

## 発生しているエラー

[code]

    Bottle v0.12.19 server starting up (using WSGIRefServer())...
    Listening on http://localhost:8080/
    Hit Ctrl-C to quit.
    
    
    Warning (from warnings module):
      File "<frozen importlib._bootstrap>", line 914
    ImportWarning: _ImportRedirect.find_spec() not found; falling back to find_module()
    
[/code]

## ソースコード

[code]

    # -*- coding: utf-8 -*-
    from bottle import route, run, template,view
    
    import mahjong
    import os
    import cgi
    import sys
    import io
    
    @route('/')
    def index():
         return template('index.html')
    
    #計算
    from mahjong.hand_calculating.hand import HandCalculator
    #麻雀牌
    from mahjong.tile import TilesConverter
    #役, オプションルール
    from mahjong.hand_calculating.hand_config import HandConfig, OptionalRules
    #鳴き
    from mahjong.meld import Meld
    #風(場&自)
    from mahjong.constants import EAST, SOUTH, WEST, NORTH
    
    #HandCalculator(計算用クラス)のインスタンスを生成
    calculator = HandCalculator()
    
    #結果出力用
    def print_hand_result(hand_result):
         #翻数, 符数
         print(hand_result.han, hand_result.fu)
         #点数(ツモアガリの場合[左：親失点, 右:子失点], ロンアガリの場合[左:放銃者失点, 右:0])
         print(hand_result.cost['main'], result.cost['additional'])
         #役
         print(hand_result.yaku)
         #符数の詳細
         for fu_item in hand_result.fu_details:
              print(fu_item)
         print('')
    
    #アガリ形(honors=1:東, 2:南, 3:西, 4:北, 5:白, 6:發, 7:中)
    tiles = TilesConverter.string_to_136_array(man='677889', pin='88', sou='456', honors='222')
    
    #アガリ牌(マンズの8)
    win_tile = TilesConverter.string_to_136_array(man='8')[0]
    
    #鳴き(なし)
    melds = None
    
    54#ドラ(表示牌,裏ドラ)
    dora_indicators = [
        TilesConverter.string_to_136_array(pin='7')[0],
        TilesConverter.string_to_136_array(sou='9')[0],
    ]
    
    #オプション(リーチ, 自風, 場風)
    config = HandConfig(is_riichi=True, player_wind=SOUTH, round_wind=EAST)
    
    #計算
    result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
    
    @route('/mahjong',method=["GET","POST"])
    def mahjong():
         a=print_hand_result(result)
         return template('mahjong.html',mahjong=a)
          
    if __name__ == "__main__":
         run(host='localhost', port=8080, debug=True)
    
    
[/code]

[code]

    <!DOCTYPE html>
    <html lang="jp">
    <html>
    <head>
    　 <meta http-equiv="content-type" content="text/html;charset=utf-8">
    　</head>
    <body>
      <center><br><br>
      <form action="/mahjong" method="POST">
        <h1><font color="#FF7F50">麻雀点数計算</font></h1><br /><br />
    　　　<input type="submit" value="結果を表示" />
      </form>
      </center>
    </body>
    </html>
    
[/code]

[code]

    <!DOCTYPE html>
    <html lang="jp">
    <html>
    <head>
    　 <meta http-equiv="content-type" content="text/html;charset=utf-8">
    　</head>
    <body>
      <center><br><br>
         <h1><font color="#FF7F50">麻雀点数計算</font></h1><br /><br />
    　  </form>
        <p>
        結果は<br /><br />　
        {{ mahjong }}
        </p>
      </center>
    </body>
    </html>
    
[/code]


CC BY-SA 4.0
2022-02-09T01:36:03.637
86219
2022-02-11T08:32:06.260
51339
question
python python3 django flask bottle
Python(Bottle)で作成したWEBアプリで結果が表示できない


[`print`](https://docs.python.org/ja/3/library/functions.html#print)関数はコンソールに文字列を表示するだけなので、`print_hand_result`が値を返さないため変数`a`が空っぽなのが端的な理由です。  
[関数](https://docs.python.org/ja/3.7/reference/compound_stmts.html#function)から値を返すには`return`を使ってください。

なお`result`変数自体が表示するデータを保持しているので、関数内で文字列を整形するのではなくテンプレートエンジンの[Jinja](https://jinja.palletsprojects.com/en/3.0.x/)などを使って、テンプレートで直接変数を展開することをお勧めします。

下記のサンプルコードは、`result`変数を`get_hand_result`関数で出力文字列に加工して返す方法と、`mahjong.html`で直接表示する方法です。  
実行には`pip install jinja2`などでパッケージをインストールしておく必要があります。

**サンプルコード**

pythonファイル

[code]

    # -*- coding: utf-8 -*-
    from bottle import route, run, view
    from bottle import jinja2_template as template
    
    import mahjong
    import os
    import cgi
    import sys
    import io
    
    @route('/')
    def index():
         return template('index.html')
    
    #計算
    from mahjong.hand_calculating.hand import HandCalculator
    #麻雀牌
    from mahjong.tile import TilesConverter
    #役, オプションルール
    from mahjong.hand_calculating.hand_config import HandConfig, OptionalRules
    #鳴き
    from mahjong.meld import Meld
    #風(場&自)
    from mahjong.constants import EAST, SOUTH, WEST, NORTH
    
    #HandCalculator(計算用クラス)のインスタンスを生成
    calculator = HandCalculator()
    
    #結果出力用
    def print_hand_result(hand_result):
         #翻数, 符数
         print(hand_result.han, hand_result.fu)
         #点数(ツモアガリの場合[左：親失点, 右:子失点], ロンアガリの場合[左:放銃者失点, 右:0])
         print(hand_result.cost['main'], result.cost['additional'])
         #役
         print(hand_result.yaku)
         #符数の詳細
         for fu_item in hand_result.fu_details:
              print(fu_item)
         print('')
    
    #結果を文字列として戻す
    def get_hand_result(hand_result):
         lines = []
         #翻数, 符数
         lines.append("{}翻 {}符".format(hand_result.han, hand_result.fu))
         #点数(ツモアガリの場合[左：親失点, 右:子失点], ロンアガリの場合[左:放銃者失点, 右:0])
         lines.append("失点1:{} 失点2:{}".format(hand_result.cost['main'], result.cost['additional']))
         #役
         yaku_names = [y.name for y in hand_result.yaku]
         lines.append("役: {}".format(", ".join(yaku_names)))
         #符数の詳細
         for fu_item in hand_result.fu_details:
              lines.append(str(fu_item))
         lines.append('')
         print(lines)
         return lines
    
    #アガリ形(honors=1:東, 2:南, 3:西, 4:北, 5:白, 6:發, 7:中)
    tiles = TilesConverter.string_to_136_array(man='677889', pin='88', sou='456', honors='222')
    
    #アガリ牌(マンズの8)
    win_tile = TilesConverter.string_to_136_array(man='8')[0]
    
    #鳴き(なし)
    melds = None
    
    54#ドラ(表示牌,裏ドラ)
    dora_indicators = [
        TilesConverter.string_to_136_array(pin='7')[0],
        TilesConverter.string_to_136_array(sou='9')[0],
    ]
    
    #オプション(リーチ, 自風, 場風)
    config = HandConfig(is_riichi=True, player_wind=SOUTH, round_wind=EAST)
    
    #計算
    result = calculator.estimate_hand_value(tiles, win_tile,melds,dora_indicators, config)
    
    @route('/mahjong',method=["GET","POST"])
    def mahjong():
         a=get_hand_result(result)
         print(a)
         t=['a','b']
         return template('mahjong.html', mj=result, is_tsumo=config.is_tsumo, lines=a)
          
    if __name__ == "__main__":
         run(host='localhost', port=8080, debug=True, reloader=True)
    
[/code]

mahjong.html

[code]

    <!DOCTYPE html>
    <html lang="jp">
    <html>
    <head>
       <meta http-equiv="content-type" content="text/html;charset=utf-8">
      </head>
    <body>
      <center><br><br>
         <h1><font color="#FF7F50">麻雀点数計算</font></h1><br /><br />
        </form>
        <p>
        結果は<br />文字列なら…<br />
        {% for line in lines %}
            {{line}}<br/>
        {% endfor %}
        </p>
        <p>
        結果は<br />mahjongインスタンスなら…<br />
        {{mj.han}}翻 {{mj.fu}}符<br/>
        {% if is_tsumo %}
            親失点: {{mj.cost['main']}} 子失点: {{mj.cost['additional']}}<br />
        {% else %}
            放銃者失点: {{mj.cost['main']}}<br />
        {% endif %} 
        役: 
        {% for yaku in mj.yaku %}
            {{yaku.name}},
        {% endfor %}
        <br/>
        符: 
        {% for fu in mj.fu_details %}
            {{fu['fu']}}({{fu['reason']}}),
        {% endfor %}
        <br/>
        </p>
      </center>
    </body>
    </html>
    
[/code]

実行結果

[![実行結果](https://i.stack.imgur.com/AdKDk.png)](https://i.stack.imgur.com/AdKDk.png)


CC BY-SA 4.0
2022-02-11T08:32:06.260
86267
2022-02-11T08:32:06.260
9820
86219
answer