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

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

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

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

Python

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

Q&A

解決済

2回答

6936閲覧

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

ioSaito

総合スコア6

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/04/18 03:43

編集2020/04/18 05:39

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

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

該当のソースコード

python

1import tkinter as tk 2from contest import Contest,Contest_1 3 4class AppBase(tk.Tk): 5 6 def __init__(self,*args,**kwargs): 7 tk.Tk.__init__(self,*args,**kwargs) 8 container = tk.Frame(self) 9 container.pack(side="top",fill="both",expand=True) 10 container.grid_rowconfigure(0,weight=1) 11 container.grid_columnconfigure(0,weight=1) 12 13 self.frame = {} 14 for F in (Home,Contest,Contest_1): 15 page_name =F.__name__ 16 frame = F(parent = container,controller=self) 17 self.frame[page_name] = frame 18 frame.grid(row=0,column=0,sticky="NSEW") 19 20 self.show_frame("Home") 21 22 def show_frame(self,page_name): 23 frame = self.frame[page_name] 24 frame.tkraise() 25### 26class Home(tk.Frame): 27 28 def __init__(self,parent,controller): 29 tk.Frame.__init__(self,parent) 30 self.controller = controller 31 32 btn = tk.Button(master=self,text="閉じる",command=self.master.destroy) 33 btn.grid(column=3,row=3,sticky=tk.NE) 34 35 36 btn2 = tk.Button(master=self,wraplength=150,justify=tk.LEFT,text="大会情報の設定、",command=lambda:controller.show_frame("Contest")) 37 btn2.grid(column=2,row=1,padx=10,pady=10,sticky=tk.NSEW) 38 39 40 41if __name__ == "__main__": 42 app = AppBase() 43 app.mainloop() 44 45### 46import tkinter as tk 47import tkinter.ttk as ttk 48 49class Contest(tk.Frame): 50 51 def __init__(self,parent,controller): 52 tk.Frame.__init__(self,parent) 53 self.controller = controller 54 55 lbl0 =tk.Label(self,text="【大会情報】") 56 lbl0.pack() 57 58 59#中略(ウィジェットの作成) 60 61 #ボタン作る 62 btn0 =tk.Button(self,text="大会設定",command=lambda:controller.show_frame("Contest_1")) 63 btn0.pack(side="left") 64 65 66 #戻るボタン 67 btn2 =tk.Button(self,text="戻る",command=lambda:controller.show_frame("Home")) 68 btn2.pack(side="right") 69 70 71 72class Contest_1(tk.Frame): 73 74 75 def __init__(self,parent,controller): 76 tk.Frame.__init__(self,parent) 77 self.controller = controller 78 self.create_widgets(controller) 79      self.save() 80 81 def create_widgets(self,controller): 82 83 ID1=tk.IntVar() 84 txt4 =tk.Entry(self,textvariable=ID1) 85 txt4.grid(column=3,row=3) 86 txt4.focus_set() 87 88 name1= tk.StringVar() 89 txt1=tk.Entry(self,textvariable=name1) 90 txt1.grid(column=3,row=4) 91 txt1.focus_set() 92 93 date1=tk.StringVar() 94 txt2=tk.Entry(self,textvariable=date1) 95 txt2.grid(column=3,row=5) 96 txt2.focus_set() 97 98 99 place1=tk.StringVar() 100 txt3=tk.Entry(self,textvariable=place1) 101 txt3.grid(column=3,row=6) 102 txt3.focus_set() 103 104 ID=int(ID1.get()) 105 name =Str(name1.get()) 106 date=Str(date1.get()) 107 place =Str(place1.get()) 108 109 btn1=tk.Button(self,text="保存") 110 btn1.grid(column=5,row=7) 111 btn1["command"]=lambda:self.save(ID,name,date,place) 112 113 114 btn2=tk.Button(self,text="編集") 115 btn2.grid(column=6,row=7) 116 117 #戻るボタン 118 btn3 =tk.Button(self,text="戻る",command=lambda:controller.show_frame("Contest")) 119 btn3.grid(column=2,row=7) 120 121 122 def save(self,ID=99,name="aaa",date="bbb",place="ccc"): 123 124 print(ID,name,date,place) 125 126 127###

試したこと

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

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

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

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

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

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

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

guest

回答2

0

自己解決

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

投稿2020/04/26 03:08

ioSaito

総合スコア6

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

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

0

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

Pythn

1class Contest_1(tk.Frame): 2 def __init__(self,parent,controller): 3 tk.Frame.__init__(self,parent) 4 self.ID = tk.IntVar() 5 self.name = tk.StringVar() 6 self.date = tk.StringVar() 7 self.place = tk.StringVar() 8 self.controller = controller 9 self.create_widgets(controller) 10 self.save() 11 12 def create_widgets(self,controller): 13 txt4 =tk.Entry(self,textvariable=self.ID) 14 txt4.grid(column=3,row=3) 15 16 txt1=tk.Entry(self,textvariable=self.name) 17 txt1.grid(column=3,row=4) 18 19 txt2=tk.Entry(self,textvariable=self.date) 20 txt2.grid(column=3,row=5) 21 22 txt3=tk.Entry(self,textvariable=self.place) 23 txt3.grid(column=3,row=6) 24 25 btn1=tk.Button(self,text="保存",command=self.save) 26 btn1.grid(column=5,row=7) 27 28 btn2=tk.Button(self,text="編集") 29 btn2.grid(column=6,row=7) 30 31 #戻るボタン 32 btn3 =tk.Button(self,text="戻る",command=lambda:controller.show_frame("Contest")) 33 btn3.grid(column=2,row=7) 34 35 def save(self): 36 print(self.ID.get(), self.name.get(), self.date.get(), self.place.get())

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

投稿2020/04/18 06:23

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問