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

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

ただいまの
回答率

90.03%

Python3 でテキスト入力Boxを開き、入力された文字を取得したい(Tkinterで試しましたがうまくいきません)

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,134

iyazyaz

score 13

目的は、パスワードを入力してもらい、予め定めたパスワード(例えば 13579)と一致したらIF構文で次のプロセスへ進み、間違っていたらelseで終了にしたいのです。
(Python3 でテキスト入力Boxを開き、入力された文字を取得したい)

Tkinterのサンプルがありましたので試してみました。

以下を走らせると、Username  Email  Password のBoXが開くのですが

①それぞれ入力された文字列はどのようにすれば取得できるのでしょうか?
②ダミーで何か入力して OKを押しても 次に進めません(Process finished with exit code 0 になりません)

まずは それぞれ入力数値を  print(???)で表示する方法と OKを押してboxが消えて次のプロセスに進めるのか教えていただけますと助かります。

もしも、他のライブラリーで目的を
簡単にできるものがあれば教えてください。

よろしくお願いします。

from tkinter import *
from tkinter import ttk

if __name__ == '__main__':
    root = Tk ()
    root.title ( 'Entry Test' )
    root.resizable ( False, False )
    frame1 = ttk.Frame ( root, padding=10 )
    frame1.grid ()

    label1 = ttk.Label ( frame1, text='Username', padding=(5, 2) )
    label1.grid ( row=0, column=0, sticky=E )

    label2 = ttk.Label ( frame1, text='Email', padding=(5, 2) )
    label2.grid ( row=1, column=0, sticky=E )

    label3 = ttk.Label ( frame1, text='Password', padding=(5, 2) )
    label3.grid ( row=2, column=0, sticky=E )

    # Username Entry
    username = StringVar ()
    username_entry = ttk.Entry (
        frame1,
        textvariable=username,
        width=30 )
    username_entry.grid ( row=0, column=1 )

    # Email Entry
    email = StringVar ()
    email_entry = ttk.Entry (
        frame1,
        textvariable=email,
        width=30 )
    email_entry.grid ( row=1, column=1 )

    # Password Entry
    password = StringVar ()
    password_entry = ttk.Entry (
        frame1,
        textvariable=password,
        width=30,
        show='*' )
    password_entry.grid ( row=2, column=1 )

    frame2 = ttk.Frame ( frame1, padding=(0, 5) )
    frame2.grid ( row=3, column=1, sticky=W )

    button1 = ttk.Button ( frame2, text='OK' )
    button1.pack ( side=LEFT )

    button2 = ttk.Button ( frame2, text='Cancel', command=quit )
    button2.pack ( side=LEFT )

    root.mainloop ()

    print(password)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

Q1, それぞれ入力された文字列はどのようにすれば取得できるのでしょうか?

A1, username.get()で取得できます。表示したいなら、print(username.get())としてくださいな。

参考:ウィジェット変数を関連付ける

Q2, ダミーで何か入力して OKを押しても 次に進めません

button2 = ttk.Button ( frame2, text='Cancel', command=quit )

と同じように引数のcommandを設定すればよいかと。

button1 = ttk.Button ( frame2, text='OK', command=quit )

予め定めたパスワード(例えば 13579)と一致したらIF構文で次のプロセスへ進み、間違っていたらelseで終了にしたいのです。

次のプロセスという部分がよく分かりませんでしたが。
やりたいことと回答を反映したサンプルコードです、ご参考まで。

# -*- coding: utf-8 -*-
from tkinter import *
from tkinter import ttk

root = Tk()
root.title('Entry Test')
# Tk()を呼び出し後に使用可能、クリックイベントから参照するために、この位置で宣言
username = StringVar()
email = StringVar()
password = StringVar()


# OKボタンをクリック時のイベント
def ok_click():
    if not (password.get() == "13579"):
        # 画面を終了=root.mainloop()の次の行から実行再開
        root.quit()
        return
    # 一致したなら
    print("Done")


def main():
    root.resizable ( False, False )
    frame1 = ttk.Frame ( root, padding=10 )
    frame1.grid ()

    label1 = ttk.Label ( frame1, text='Username', padding=(5, 2) )
    label1.grid ( row=0, column=0, sticky=E )

    label2 = ttk.Label ( frame1, text='Email', padding=(5, 2) )
    label2.grid ( row=1, column=0, sticky=E )

    label3 = ttk.Label ( frame1, text='Password', padding=(5, 2) )
    label3.grid ( row=2, column=0, sticky=E )

    # Username Entry
    username_entry = ttk.Entry (
        frame1,
        textvariable=username,
        width=30 )
    username_entry.grid ( row=0, column=1 )

    # Email Entry
    email_entry = ttk.Entry (
        frame1,
        textvariable=email,
        width=30 )
    email_entry.grid ( row=1, column=1 )

    # Password Entry
    password_entry = ttk.Entry (
        frame1,
        textvariable=password,
        width=30,
        show='*' )
    password_entry.grid ( row=2, column=1 )

    frame2 = ttk.Frame ( frame1, padding=(0, 5) )
    frame2.grid ( row=3, column=1, sticky=W )
    button1 = ttk.Button ( frame2, text='OK', command=ok_click)
    button1.pack ( side=LEFT )
    button2 = ttk.Button ( frame2, text='Cancel', command=quit )
    button2.pack ( side=LEFT )

    root.mainloop()

    print(password.get())


if __name__ == '__main__':
    main()

他のライブラリーで

Python言語に限定していえば、QtDesignerが使えるPyQTKivyですが。
他の質問者にもお伝えしているのですが、
PythonでGUIアプリ作成は調べるのが大好きな方以外は初心者には全くお勧めできません。

  1. 日本語の公式ドキュメント情報が壊滅的。
    あってもサンプルコードか動かないサンプルコード。
    必然的に2次情報(誰かのサンプルを見て初心者がQiitaに記事を書いて見ました系)か英語の1次情報を当たる必要があります。
  2. 解説内容が他言語でGUIアプリを作成した事がある人向けの内容。
    前提知識として
    ・イベント駆動型プログラミング
    ・レイアウトマネージャ(tkinterならばpack, grid, place)
    この2単語についての理解が必要。

お勧めはC#言語でWPFアプリケーションを作成です。
日本語のサンプルコードが多く悩まないかと。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/29 15:15

    どうもありがとうございます。password.get() だったのですね。助かりました。次に進めます。感謝いたします。

    キャンセル

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

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