質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.33%

Python 計算ツールが作動しない。ネームエラー

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 252

score 1

前回も同じ質問をしましたが、コードの記載場所のミスを修正したところ、「更新ボタン」が機能しなかったため、再度新たに質問をさせて頂きます。

<目的>

外部テキストを使用して、計算機能ツールを作動させたい。

<現状>

cm-->inchesは作動します。

inches --->cmはエラーが表示されてしまします。

Python

発生している問題・エラーメッセージ

cmからインチへの変換は出来るのに、インチからCmを試すと以下のエラーが表示されてしまいます。

<エラーメッセージ>

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Maya\AppData\Local\Programs\Python\Python39\lib\tkinter\init.py", line 1892, in call
return self.func(*args)
File "F:\NewStage3.py", line 44, in conversion
num = inchestocm(float(txtInput.get()))
File "F:\NewStage3.py", line 17, in inchestocm
inches /= INCHES_TO_CM
NameError: name 'INCHES_TO_CM' is not defined

pythonに挿入用のテキストファイルのコンテンツ
cm_to_inches, 0.394

コード

## Date created: 30 April 2021
## Date last changed: 29 April 2021
## This Program does to convert cm to inches, and inches to cm.
## Input:None, Output:None

CM_TO_INCHES = 0 #Crearing global valuable

# Import module
from tkinter import *

def cmtoinches(cm):
    cm *= CM_TO_INCHES
    return round(cm, 2)

def inchestocm(inches):
    inches /= INCHES_TO_CM  
    return round(inches, 2)

def loadConversion():
    global CM_TO_INCHES
    f = open("operations.txt", "r")
    L1 = f.readline()
    val=L1.split(",")
    CM_TO_INCHES = float(val[1])       

#Create object
loadConversion()
root = Tk()
root.title("convert length")
root.configure(background="#EEEFFF")
theLabel = Label(root, text="This is a cm/inches conversion, please select the unit, and add length you wish to convert to")

# Adjust size
# root.geometry( "200x200" )

# Change the label text
def conversion():
    num = 0
    if (clicked.get() == "cm"):
        num = cmtoinches(float(txtInput.get()))
        lblOutput.config( text = str(num) + " inches" )
    else:
        num = inchestocm(float(txtInput.get()))
        lblOutput.config( text = str(num) + " cm" )


def changeInput(value):
    if (clicked.get() == "cm"):
        lblInput.config( text = "Convert to inches" )
    else:
        lblInput.config( text =  "Convert to cm" )

# def conversion():
#     if clicked

# Dropdown menu options
options = [
    "cm",
    "inches"
]

# datatype of menu text
clicked = StringVar()
# initial menu text
clicked.set( options[0] )

lblValue = Label(root, text="Insert a value").pack()

txtInput =StringVar()
e1=Entry(root, textvariable=txtInput).pack()

lblInput = Label( root , text="inches" )
lblInput.pack()

lblSelect = Label(root, text="Select unit to be converted into").pack()


# Create Dropdown menu
drop = OptionMenu( root , clicked , *options, command=changeInput)
drop.pack()

# Create button, it will change label text
btnConvert = Button(root , text = "convert" , command = conversion ).pack()
btnExit =Button(root, text="click to exit", command=root.destroy).pack()

# Create Label
lblOutput = Label( root , text = "", fg="#0000FF" )
lblOutput.pack()

# Execute tkinter
root.mainloop()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 1T2R3M4

    2021/05/01 18:14

    name 'INCHES_TO_CM' is not defined
    に対して試みたことを追記していただけませんか。

    キャンセル

  • Mayaa

    2021/05/01 22:19

    def INCEHC_TO_CMと入力してみたのですが、変化ありませんでした。

    キャンセル

回答 2

checkベストアンサー

+1

以下の関数で、変換のための定数を設定していますよね。この中でCM_TO_INCHESは設定していますが、エラーに出てくるINCHES_TO_CMは設定していません。

def loadConversion():
    global CM_TO_INCHES
    f = open("operations.txt", "r")
    L1 = f.readline()
    val=L1.split(",")
    CM_TO_INCHES = float(val[1])  


この関数でINCHES_TO_CMも設定したり、golbal変数の初期化をしたり、他にもCM_TO_INCHES では行なわれていることをいろいろ注意しながら直さないといけません。


インチをセンチメートルに変換する処理についてなおさなきゃならないところがいくつもあります。
課題のようですから書いてしまわず、ヒント出しましょう。
ただし、これだけでうまくいくかどうかはわかりませんけどね。

まずはこのあたりでグローバル変数INCHES_TO_CMの設定が必要です。初期値は0でいいでしょう。

CM_TO_INCHES = 0 #Crearing global valuable

次に、初期化が必要です。 以下の場所で「operations.txt」から読みましょう。
現状は1行目にCM_TO_INCHESが入てちるようですから、2行目にINCHES_TO_CMの値を書いておくことにしましょう。
すると下の処理に2行目を読む処理を追加すればいいでしょう。 global宣言を追加して、下の3行を繰り返せばいいはず。

def loadConversion():
    global CM_TO_INCHES
    f = open("operations.txt", "r")
    L1 = f.readline()
    val=L1.split(",")
    CM_TO_INCHES = float(val[1])  

とりあえず、この2つで動くようになるんじゃないかなぁ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/02 01:00

    ありがとうございます。
    Python初心者で、このコードも先生に聞きながら作成をしたため、お恥ずかしながらどのように訂正をすればいいか詳細にお教え頂くことは可能でしょうか?
    祝日で先生にも聞けず、このコードの提出締切が迫っており本当に困っております。

    どうぞ、よろしくお願い致します。

    キャンセル

0

NameError: name 'INCHES_TO_CM' is not defined 

'INCHES_TO_CM' が定義されてない、とおっしゃってますので、
そこらへんどーにかしましょう 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る