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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

926閲覧

pythonのtkinterでframeを作ったらdefの処理ができなくなったので、それを修正したい。

tan.sansui

総合スコア2

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/24 09:34

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

python初心者です。全くわからず質問させていただきました。
pythonを使用していてtkinterでGUIを作っています
gridとpackを共存させたいと考えframe?を作ってみましたが、もともとdefで定義していた計算ができなくなりました。
それとentryに文字を出した状態のままにしようと思っても、それもできませんでした。

2点ご教授いただけたら幸いです。
よろしくお願いします

該当のソースコード

import tkinter as tk

root = tk.Tk()
root.title("栄養")

frame1 = tk.Frame(root)
def vital():
val_1 = float(textBox1.get())
if val_1 > 1:
answer1 = eval("150")
answer_ent1.delete(0, tk.END)
answer_ent1.insert(0, answer1)
answer2 = eval("200")
answer_ent2.delete(0, tk.END)
answer_ent2.insert(0, answer1)
else :
answer1 = eval("200")
answer_ent1.delete(0, tk.END)
answer_ent1.insert(0, answer1)
def calc_bmi():

val_1 = int(textBox2.get()) / 100
val_2 = int(textBox3.get())
# ↓文字列状態の式を実行
answer = eval("val_2 / val_1** 2")
answer_ent.delete(0, tk.END)
answer_ent.insert(0, answer)

label1 = tk.Label(frame1, text='年齢').grid(row = 0, column = 0)
label2 = tk.Label(frame1, text='身長').grid(row = 0, column = 2, sticky = "wens")
label3 = tk.Label(frame1, text = "体重(kg)").grid (row = 0, column = 4, sticky = "wens")
label4 = tk.Label(frame1, text = "BMI").grid(row = 0, column = 6, sticky = "wens")
label5 = tk.Label(frame1, text = "栄養").grid(row = 1, column = 6, sticky = "wens")

textBox1= tk.Entry(frame1).grid(row = 0, column = 1, sticky = "wens", padx = 10, pady = 10)

textBox2= tk.Entry(frame1).grid(row = 0, column = 3, sticky = "wens", padx = 10, pady = 10)

textBox3= tk.Entry(frame1).grid(row = 0, column = 5, sticky = "wens", padx = 10, pady = 10)

answer_ent= tk.Entry(frame1).grid(row = 0, column = 7, sticky = "wens", padx = 10, pady = 10)
answer_ent1= tk.Entry(frame1).grid(row = 1, column = 7, sticky = "wens", padx = 10, pady = 10)
answer_ent2= tk.Entry(frame1).grid(row = 2, column = 7, sticky = "wens", padx = 10, pady = 10)

calcButton = tk.Button(frame1, text=u'計算',command=lambda:[vital(), calc_bmi()]).grid(row = 1, column = 0, padx = 10, pady = 10)

frame1.pack()

frame2 = tk.Frame(root)
textBox4= tk.Entry(frame2,text=u',width = 40).pack()
textBox5= tk.Entry(frame2,width = 40).pack()
textBox6= tk.Entry(frame2,width = 40).pack()
textBox7= tk.Entry(frame2,width = 40).pack()
textBox8= tk.Entry(frame2,width = 40).pack()
frame2.pack(side='left')

root.rowconfigure(0, weight=1) #1行目の引き伸ばし設定
root.rowconfigure(1, weight=1) #2行目の引き伸ばし設定
root.columnconfigure(0, weight=1) #1列目の引き伸ばし設定
root.columnconfigure(1, weight=1) #2列目の引き伸ばし設定

root.mainloop() #イベントループ

python3

1ソースコード

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2021/03/24 10:06

質問を見返してください、コードが見にくいです。```でコードを囲って見やすくしてください。 ちなみに、GUIアプリの場合、基本的には何らかのイベントに応じて処理を行うことになります。そのイベントは何になりますか?
guest

回答1

0

ベストアンサー

python

1# 誤 2textBox1 = tk.Entry(...).grid(...)

問題点: textBox1 は grid() の戻り値 なので None になります。

その為、float(textBox1.get()) は、目的のウィジェットを正しく参照できてません。

同じ変数を2度書くのを手間に感じるかもしれませんが、
初期化とレイアウトは別にした方が保守しやすいコードになります。
(バージョン管理で変更差分を見る場合等、長い行は変更箇所が解り難い)

python

1# 正 2textBox1 = tk.Entry(...) 3textBox1.grid(...)

tk.Entry(...).grid() の様に連続して記述する場合は、
戻り値を変数に入れてはいけません。 使い所・状況を選びます。

  • 後から参照する必要のないウィジェット。固定の Label 等
  • 後から参照する場合は name を付けて、nametowidget で探索可能にする。
  • Variable オブジェクトを用いて、必要な値は別の変数から参照する。

お勧めの解決策は、データとウィジェットを分離する方法です

python

1 2bmiVar = tk.IntVar() # DoubleVar/BooleanVar/StringVar 等、データの型に応じて 3 4tk.Entry(..., textvar=bmiVar).grid(...) 5 6print(bmiVar.get()) 7

grid/pack でウィジェット自身を返す方法

現状の記述のコードをなんとかして動かしたい場合

python

1 2# 全てのウィジェットの grid() の挙動を変更する 3 4def _grid_hook(self, **kw): 5 tk.Grid.grid_configure(self, **kw) 6 return self 7 8tk.Grid.grid = _grid_hook 9

pack も同様に tk.Pack.pack を差し替える事で対応可能です。

コードを読む人が困惑する可能性があるので、
内部動作を変えるのは、お勧めではありませんが、こういう方法もあるという紹介のみ。
(※ pack()/pack() の戻り値で None を期待するコードは動かなくなります。)

投稿2021/03/24 17:17

編集2021/03/24 18:04
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tan.sansui

2021/03/26 06:10

ご指摘の通り直してみましたら 計算できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問