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

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

ただいまの
回答率

91.35%

  • Python 3.x

    2411questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Tkinter

    53questions

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

TkinterでLabelとEntryを複数作成する

解決済

回答 1

投稿 2017/11/23 18:29

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

Yhaya

score 20

状況

Python3.6において, tkinterを使ってGUIを作成している。入力欄をいくつか作っているのだがコードが明らかに冗長になってしまう。

問題のコード

root = Tk.Tk()
root.geometry("1000x600")

state1 = Tk.Label(root, text="Data File :")
state1.place(relx=0.01, rely=0.005)
key1 = Tk.Entry(root, width=80)
key1.focus_set()
key1.place(relx=0.07, rely=0.01)

state2 = Tk.Label(root, text="Ref File :")
state2.place(relx=0.01, rely=0.055)
key2 = Tk.Entry(root, width=80)
key2.place(relx=0.07, rely=0.055)

state3 = Tk.Label(root, text="Sample Name :")
state3.place(relx=0.01, rely=0.10)
key3 = Tk.Entry(root, width=20)
key3.place(relx=0.1, rely=0.105)


これがstate10, key10までひたすら続いていく感じです。同じ作業を一つのクラスにまとめるにはどのように記述すればよいのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

質問文はLabelとEntryを合わせたクラスを新規に作りたいという話なのでしょうか?
それともパラメータを元にGUIの生成処理を纏めたいという話なのでしょうか?

どこまでGUIの生成処理に汎用性を持たせるのかは、要件と時間とのトレードオフになりますが。
あるパラメータを元にGUIの生成処理を自動化したいだけでしたら。
以下のようになります。

# -*- coding: utf-8 -*-
import tkinter as Tk
from collections import OrderedDict
from pprint import PrettyPrinter


def load_widget():
    widget_list = list()
    widget_list.append({'type': 'Label', 'text': "Data File :", 'relx': 0.01, 'rely': 0.005})
    widget_list.append({'type': 'Entry', 'width': 80, 'relx': 0.07, 'rely': 0.01, 'focus_set': True})
    widget_list.append({'type': 'Label', 'text': "Ref File :", 'relx': 0.01, 'rely': 0.055})
    widget_list.append({'type': 'Entry', 'width': 80, 'relx': 0.07, 'rely': 0.055})
    widget_list.append({'type': 'Label', 'text': "Sample Name :", 'relx': 0.01, 'rely': 0.10})
    widget_list.append({'type': 'Entry', 'width': 20, 'relx': 0.1, 'rely': 0.105})
    return widget_list


def create_widgets(root):
    # ルート参照から到達できるように生成したwidgetを保持
    widget_dict = OrderedDict()
    for i, component in enumerate(load_widget()):
        widget = None
        if component['type'] == 'Label':
            widget = Tk.Label(root, text=component['text'])
        elif component['type'] == 'Entry':
            widget = Tk.Entry(root, width=component['width'])
            if 'focus_set' in component:
                if component['focus_set']:
                    widget.focus_set()
        else:
            assert widget is not None, component['type']
        widget.place(relx=component['relx'], rely=component['rely'])
        widget_dict[i] = widget
    return widget_dict


def main():
    root = Tk.Tk()
    root.geometry("1000x600")
    root.widgets = create_widgets(root)
    # 作成したwidgetを出力
    pp = PrettyPrinter(indent=4)
    pp.pprint(root.widgets)
    root.mainloop()


if __name__ == '__main__':
    main()
  1. GUIの生成処理は使用するレイアウトマネージャに依存します
    今回の場合は#placeメソッドです。
  2. GUIの構成情報はjsonまたはxml形式のファイルにして、読み込んだ方が汎用性が高いです。
  3. Tk.Entry,Tk.Labelのコンストラクタは引数:optionsとしてdictを受け付けるので、あるLabelに設定値が大量にある場合は、dictをそのまま渡す形にしたほうが楽です。
  4. GUIをごりごり書く場合はtkinter 以外のウィジットについて一考してみてはー。

投稿 2017/11/24 05:44

編集 2017/11/24 05:55

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    Python - Tkinter ボタンのコマンドが変わってしまう

    ※つまづいているのはPythonの仕様を僕が知らないからかもしれませんので、Tkinterをご存知でない方も一読いただければと思います。初心者ですが、よろしくお願いします。

  • 受付中

    字下げについて

    お世話になります 本日マイナビ第26章を勉強しております http://news.mynavi.jp/series/python/026/ この中でどうしてもコマンドの字下げ

  • 解決済

    Python Tkinter ラジオボタン選択後に他のボタンを選択できないようにしたい

    閲覧、ありがとうございます。 tkinterを使用してGUIを作成しています。 ラジオボタンを選択後、同じウィンドウ内でラジオボタンを表示させたまま 次のイベントを出現さ

  • 解決済

    バインドの解除

    前提・実現したいこと Python・Tkinterで簡単なアプリケーションを作成していて、下記の様なコードを書きました。特にエラー等はないのですが、一度root.bind('<R

  • 解決済

    TkinterでGUIを作りたい

    pythonのtkinterを使っています。canvas上でマウスクリックをするたびにその場所に円をひとつ描画して、ドラッグで好きな円を動かすというプログラムを作りたいと思っていま

  • 解決済

    Python tkinterでSpinboxで入力した値を得て計算し、表示させるにはどうしたら良いで...

    前提・実現したいこと PyhonでTkinterを用いてGUIアプリケーションを作成しています。 文房具の請求のプログラムなのですが、イメージはamazonなどの 通販サイト

  • 解決済

    なぜretunがなくても動くのか

    import tkinter from PIL import Image, ImageTk root = tkinter.Tk() image = Image.open("./c

  • 解決済

    Tkinterのwindow

    Tkinterでwindowを画面中央に置く方法を教えてください。 どんなに調べても出てこなかったので... python2.7 macos10.12.6

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

  • Python 3.x

    2411questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Tkinter

    53questions

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