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で書いています。
ほかにも読み込んでいるクラスがありますが、問題は発生していないので割愛しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。