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

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

ただいまの
回答率

88.37%

Tkinterのエントリーで値が取得・表示できない

解決済

回答 2

投稿 編集

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

ioSaito

score 6

Python、Tkinter を用いて大会の情報を管理するGUIアプリケーションを作りたいと思っています。
基本的な流れは入力(GUI)→処理→データベースに保存、処理結果を出力、というものを想定しています。
Tkinterで作成したエントリーに手入力した文字列・整数をデータベースに書き込もうと思い、まずは入力をprint()でコンソールに返すコードをかきました。

エラーは発生せず、ウィンドウも表示されるのですが決定ボタンを押しても返ってくる値が入力したものではなく0になってしまいます。

該当のソースコード

import tkinter as tk
from contest import Contest,Contest_1

class AppBase(tk.Tk):

    def __init__(self,*args,**kwargs):
        tk.Tk.__init__(self,*args,**kwargs)
        container = tk.Frame(self)
        container.pack(side="top",fill="both",expand=True)
        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        self.frame = {}
        for F in (Home,Contest,Contest_1):
            page_name =F.__name__
            frame = F(parent = container,controller=self)
            self.frame[page_name] = frame
            frame.grid(row=0,column=0,sticky="NSEW")

        self.show_frame("Home")

    def show_frame(self,page_name):
        frame = self.frame[page_name]
        frame.tkraise()
###
class Home(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller

        btn = tk.Button(master=self,text="閉じる",command=self.master.destroy)
        btn.grid(column=3,row=3,sticky=tk.NE)


        btn2 = tk.Button(master=self,wraplength=150,justify=tk.LEFT,text="大会情報の設定、",command=lambda:controller.show_frame("Contest"))
        btn2.grid(column=2,row=1,padx=10,pady=10,sticky=tk.NSEW) 



if __name__ == "__main__":
       app = AppBase()
       app.mainloop()

###
import tkinter as tk
import tkinter.ttk as ttk

class Contest(tk.Frame):

     def __init__(self,parent,controller):
         tk.Frame.__init__(self,parent)
         self.controller = controller

         lbl0 =tk.Label(self,text="【大会情報】")
         lbl0.pack()


#中略(ウィジェットの作成)

         #ボタン作る
         btn0 =tk.Button(self,text="大会設定",command=lambda:controller.show_frame("Contest_1"))
         btn0.pack(side="left")


        #戻るボタン
         btn2 =tk.Button(self,text="戻る",command=lambda:controller.show_frame("Home"))
         btn2.pack(side="right")



class Contest_1(tk.Frame):


      def __init__(self,parent,controller):
          tk.Frame.__init__(self,parent)
          self.controller = controller
          self.create_widgets(controller)
      self.save()

      def create_widgets(self,controller):

          ID1=tk.IntVar()
          txt4 =tk.Entry(self,textvariable=ID1)
          txt4.grid(column=3,row=3)
          txt4.focus_set()

          name1= tk.StringVar()
          txt1=tk.Entry(self,textvariable=name1)
          txt1.grid(column=3,row=4)
          txt1.focus_set()

          date1=tk.StringVar()
          txt2=tk.Entry(self,textvariable=date1)
          txt2.grid(column=3,row=5)
          txt2.focus_set()


          place1=tk.StringVar()
          txt3=tk.Entry(self,textvariable=place1)
          txt3.grid(column=3,row=6)
          txt3.focus_set()

          ID=int(ID1.get()) 
          name =Str(name1.get())
          date=Str(date1.get())
          place =Str(place1.get())

          btn1=tk.Button(self,text="保存")
          btn1.grid(column=5,row=7)
          btn1["command"]=lambda:self.save(ID,name,date,place)


          btn2=tk.Button(self,text="編集")
          btn2.grid(column=6,row=7)

      #戻るボタン
          btn3 =tk.Button(self,text="戻る",command=lambda:controller.show_frame("Contest"))
          btn3.grid(column=2,row=7)


      def save(self,ID=99,name="aaa",date="bbb",place="ccc"):

          print(ID,name,date,place)


###

試したこと

・self.save()とそれに渡すデフォルト引数をinitの下で定義する→デフォルトから変更されない
・self.save()のみinitの下で定義,デフォルト引数はdef で定義→デフォルトが表示されたのち決定ボタンで0になる
・引数の定義をやめる→name○○ is not defined
・int(○○.get())などをやめる→PY_VAR

 

Python 3です。
Spyderで書いています。
ほかにも読み込んでいるクラスがありますが、問題は発生していないので割愛しています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

0

Entry自体にself.をつけてメンバー変数にしたら大丈夫でした。
回答してくださった方、ありがとうございます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

簡単な修正方法としては、単純にID,name,date,place の値をクラスのメンバー変数にするのが良いかと思います。

class Contest_1(tk.Frame):
      def __init__(self,parent,controller):
          tk.Frame.__init__(self,parent)
          self.ID = tk.IntVar()
          self.name = tk.StringVar()
          self.date = tk.StringVar()
          self.place = tk.StringVar()
          self.controller = controller
          self.create_widgets(controller)
          self.save()

      def create_widgets(self,controller):
          txt4 =tk.Entry(self,textvariable=self.ID)
          txt4.grid(column=3,row=3)

          txt1=tk.Entry(self,textvariable=self.name)
          txt1.grid(column=3,row=4)

          txt2=tk.Entry(self,textvariable=self.date)
          txt2.grid(column=3,row=5)

          txt3=tk.Entry(self,textvariable=self.place)
          txt3.grid(column=3,row=6)

          btn1=tk.Button(self,text="保存",command=self.save)
          btn1.grid(column=5,row=7)

          btn2=tk.Button(self,text="編集")
          btn2.grid(column=6,row=7)

          #戻るボタン
          btn3 =tk.Button(self,text="戻る",command=lambda:controller.show_frame("Contest"))
          btn3.grid(column=2,row=7)

      def save(self):
          print(self.ID.get(), self.name.get(), self.date.get(), self.place.get())

ただし現状のコードでは IDのEntryに数値に変換できない文字列を入力している場合には、save時に例外が発生しますのでValidation をかけるなどの対策が必要ですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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