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

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

ただいまの
回答率

87.49%

Spinboxの更新

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,241

score 12

 前提・実現したいこと

Spinboxの最大値を読み込んだファイルの行数で変化させたいと思っています。読み込んだ行数はLine_noという変数に保存したいと考えています。SpinboxLine_noの値が def any(path)内のLine_noの値に置き換えるにはどうすればいいのでしょうか。

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

Line_noに読み込んだ行数を保存はできるのですが、Spinboxの最大値が10のままです。

 該当のソースコード

anaframe = Frame(root)
anaframe.grid(row = 0, column=0, sticky='news')

Line_no = 10

def any(path):


    #============列が一定でないcsvを読み込む定義==============
    col_names = [0,1,2,3,4,5,6,7,8,9,10]

    scvfilename = os.path.abspath(file)
    os.chdir(os.path.abspath(os.path.dirname(os.path.abspath(file))))
    df = pd.read_csv(path,header = None, names =col_names , encoding = 'shift-jis', engine='python')

    Line_no = len(df)

    print(Line_no)

section1frameh = Frame(anaframe,pady=10)
section1frameh.pack()

low = Spinbox(section1frameh,from_ = 1, to = Line_no, increment = 1)
low.pack(side = 'left')

tilde = Label(section1frameh,text = '  ~  ',font = 8)
tilde.pack(side = 'left')

high = Spinbox(section1frameh,from_ = 1, to = Line_no, increment = 1)
high.pack(side = 'left')

 補足

def any(path)pathはファイルパスになります。

追記(18/10/02) ※このような追記になってしまい申し訳ございません。

any(path)に関しましては別関数でファイル参照ダイアログからcsvファイルを参照してany(path)を呼び出しています。

def reference_callback():


    tkinter.messagebox.showinfo('注意','CSVファイルを参照してください。')
    global file

    file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
    if file != "" :
        tkinter.messagebox.showinfo('インフォメーション',file)
        print("%r"%(os.path.basename(file)))
        print("パス%r"%file)
        print("絶対パス%r"%(os.path.abspath(file)))
        any(file)
        print(Line_no_back)
        print(dirname)

        if os.path.exists(CH_settingPATH):

            ifCH = tkinter.messagebox.askyesno('確認','設定の変更をしますか')
            if ifCH == True:
                CH_setting()

        else:
            tkinter.messagebox.showinfo('確認','設定をしてください。')
            CH_setting()
    else :
        tkinter.messagebox.showinfo('エラー','選択できていません。')
        del file


このコードの下に上記のdef any(path)が来る形になっています。申し訳ございません

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

変数のスコープが違うので
同じ変数名でも関数内と関数外では別物です。

Line_no = 10なので外側で出力しても10のままです。

Line_no = 10

def any():
    Line_no = 20
    print('こういう',Line_no)

any()
print('ことです',Line_no)

出力結果

こういう 20
ことです 10

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

質問のコードでは関数any(path)をどこからも呼び出していないのでLine_no = 10のままです。

関数any(path)を呼び出し、戻り値を受け取るようにすれば良いかと思います。

def any(path):
    #中略
    #Line_no = len(df) #削除
    return len(df) #追加
Line_no = any(path)
section1frameh = Frame(anaframe,pady=10)
#以下略

説明だけだと分かりづらいかもしれないので全体

anaframe = Frame(root)
anaframe.grid(row = 0, column=0, sticky='news')

Line_no = 10

def any(path):


    #============列が一定でないcsvを読み込む定義==============
    col_names = [0,1,2,3,4,5,6,7,8,9,10]

    scvfilename = os.path.abspath(file)
    os.chdir(os.path.abspath(os.path.dirname(os.path.abspath(file))))
    df = pd.read_csv(path,header = None, names =col_names , encoding = 'shift-jis', engine='python')

# 修正ここから
# 不要なので削除
#     Line_no = len(df)
#     print(Line_no)

    return len(df) #追加

path = 'ファイルパス' #追加
Line_no = any(path) #追加
# 修正ここまで

section1frameh = Frame(anaframe,pady=10)
section1frameh.pack()

low = Spinbox(section1frameh,from_ = 1, to = Line_no, increment = 1)
low.pack(side = 'left')

tilde = Label(section1frameh,text = '  ~  ',font = 8)
tilde.pack(side = 'left')

high = Spinbox(section1frameh,from_ = 1, to = Line_no, increment = 1)
high.pack(side = 'left')

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/02 18:17

    すみません。def any(path)は別関数 def reference_callback(): で呼び出しています。質問内容に追記という形になりますが、もう一度ご教示お願いいたします。誠に申し訳ございません。

    キャンセル

  • 2018/10/02 18:34

    分かりにくいようなので別回答します。

    キャンセル

  • 2018/10/02 18:40

    どこにもLine_no = 10を変更してる箇所が無いということです。
    Line_no = ←どこかで何かしらの処理か関数の戻り値などで代入してください。

    キャンセル

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

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

関連した質問

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