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

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

新規登録して質問してみよう
ただいま回答率
85.45%
Python 3.x

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

Q&A

解決済

1回答

423閲覧

Python tkinterでボタンが表示されません。

mizumimizu

総合スコア28

Python 3.x

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

0グッド

0クリップ

投稿2023/05/28 13:11

実現したいこと

pythonコードtkinterでボタンが出現しません。

前提

下記のコードを実行した際に途中ボタン(def middle()に紐づいたボタン)が表示されません。
原因を教えていただけないでしょうか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

import pandas as pd import tkinter as tk import numpy as np import matplotlib.pyplot as plt from tkinter import ttk from tkinter import filedialog def Input(): root = tk.Tk() root.title('Lens Data Editor') root.geometry('+800+200') # ウィンドウの表示位置を指定 frame = ttk.Frame(root) frame.grid(row=0, column=0) # 項目をつくる items = ['No.', '曲率半径R', '肉厚間隔T', '硝材', '有効半径'] for i in range(0, len(items)): label_item = ttk.Label(frame, text=items[i]) label_item.grid(row=0, column=i) n = 20 # 行数 # 項目1 items1 = [0] * n for i in range(0, n): items1[i] = tk.IntVar() item1 = ttk.Entry(frame, textvariable=items1[i], width=10) item1.grid(row=i+1, column=0) item1.insert(i, i) # 項目2 items2 = [0] * n for i in range(0, n): items2[i] = tk.DoubleVar() item2 = ttk.Entry(frame, textvariable=items2[i], width=10) item2.grid(row=i+1, column=1) # 項目3 items3 = [0] * n for i in range(0, n): items3[i] = tk.DoubleVar() item3 = ttk.Entry(frame, textvariable=items3[i], width=10) item3.grid(row=i+1, column=2) # 項目4 items4 = [0] * n for i in range(0, n): items4[i] = tk.DoubleVar() item4 = ttk.Entry(frame, textvariable=items4[i], width=10) item4.grid(row=i+1, column=3) # 項目5 items5 = [0] * n for i in range(0, n): items5[i] = tk.DoubleVar() item5 = ttk.Entry(frame, textvariable=items5[i], width=10) item5.grid(row=i+1, column=4) # Enterが押された時の処理 def move_to_next_row(event): # current position info = event.widget.grid_info() r, c = info['row'], info['column'] # number of rows nrows = frame.grid_size()[1] # move to next row r = (r + 1) if r < nrows-1 else r frame.grid_slaves(row=r, column=c)[0].focus_set() for w in frame.winfo_children(): if isinstance(w, ttk.Entry): w.bind('<Return>', move_to_next_row) w.bind('<Down>', move_to_next_row) # 上が押された時の処理 def move_to_prev_row(event): # current position info = event.widget.grid_info() r, c = info['row'], info['column'] # number of rows # nrows = frame.grid_size()[1] # move to next row r = (r - 1) if r > 1 else r frame.grid_slaves(row=r, column=c)[0].focus_set() for w in frame.winfo_children(): if isinstance(w, ttk.Entry): w.bind('<Up>', move_to_prev_row) # 右が押された時の処理 def move_to_right_row(event): # current position info = event.widget.grid_info() r, c = info['row'], info['column'] # number of columns ncolumns = frame.grid_size()[1] # move to next row # c = (c + 1) if c > 1 else c c = (c + 1) if c < ncolumns-1 else c frame.grid_slaves(row=r, column=c)[0].focus_set() for w in frame.winfo_children(): if isinstance(w, ttk.Entry): w.bind('<Right>', move_to_right_row) # 左が押された時の処理 def move_to_left_row(event): # current position info = event.widget.grid_info() r, c = info['row'], info['column'] # number of columns # ncolumns = frame.grid_size()[1] # move to next row c = (c - 1) if c > 1 else c # c = (c + 1) if c < ncolumns-1 else c frame.grid_slaves(row=r, column=c)[0].focus_set() for w in frame.winfo_children(): if isinstance(w, ttk.Entry): w.bind('<Left>', move_to_left_row) # 実行ボタン def execute(): #これまでの入力をリストに入れる table_data = [] for i in range(0, n): table_data.append([items1[i].get(), items2[i].get(), items3[i].get(), items4[i].get(), items5[i].get()]) # pandas dataframeに変換 df = pd.DataFrame(table_data, columns=['No.', '曲率半径R', '肉厚間隔T', '硝材', '有効径']) # 結果表示 Output(df) button = ttk.Button(root, text='計算', padding=5, command=execute) button.grid(row=1, column=0) #utton = ttk.Button(root, text='計算', padding=5, command=execute) #utton.grid(row=3, column=0) # レンズ描画 def lens_draw(): # 新しいルートウィンドウを作成 root2 = tk.Tk() root2.title('Lens Drawing') root2.geometry('600x400') # ウィンドウのサイズを指定 # ウィンドウの内容を配置するフレームを作成 frame2 = ttk.Frame(root2) frame2.grid(row=0, column=0) max = 0 length = 0 for i in range(0, n): if(items5[i].get()>0): angle_1 = np.arcsin(items5[i].get()/items2[i].get()) #angle_2 = np.arcsin(float(items5[i].get())/float(items2[i].get())) tmp = items5[i].get() if(tmp>max): max = tmp # Canvasを置く canvas = tk.Canvas(root2, width = 600, height = 400, bg="white") canvas.place(x = 0, y = 0) #canvas.translate(width, height/2) # 曲率半径を描く if(items2[i].get()>0): canvas.create_arc(length, items2[i].get(), length+2*items2[i].get(), -items2[i].get(), start=180-angle_1, extent=180+angle_1, style=tk.ARC) if(items2[i].get()<0): canvas.create_arc(length+2*items2[i].get(), -items2[i].get(), length, items2[i].get(), start=360+angle_1, extent=-angle_1, style=tk.ARC) if(items2[i].get()==0): canvas.create_line(length, items5[i].get(), length, items5[i].get()) #fig, ax = plt.subplots() #ax.add_patch(plt.arc(float(items2[i]), length + float(items2[i]), angle_1, angle_2)) length = length + items3[i].get() #ax.set_xlim([0, length]) #ax.set_ylim([-max, max]) #plt.axis('equal') # アスペクト比を保持 #plt.grid(True) # グリッド線を表示(任意) #plt.show() # ルートウィンドウをメインループで表示 root2.mainloop() button = ttk.Button(root, text='描画', padding=5, command=lens_draw) button.grid(row=2, column=0) root.mainloop() # 途中経過の出力 def middle(): max = 0 length = 0 for i in range(0, n): if(items5[i].get()>0): angle_1 = np.arcsin(items5[i].get()/items2[i].get()) #angle_2 = np.arcsin(float(items5[i].get())/float(items2[i].get())) tmp = items5[i].get() if(tmp>max): max = tmp print(i+"回目") print("items1[" + str(i) + "]:" + str(items1[i].get())) print("items2[" + str(i) + "]:" + str(items2[i].get())) print("items3[" + str(i) + "]:" + str(items3[i].get())) print("items4[" + str(i) + "]:" + str(items4[i].get())) print("items5[" + str(i) + "]:" + str(items5[i].get())) print("angle_1:" + str(angle_1)) button = ttk.Button(root, text='途中', padding=5, command=middle) button.grid(row=3, column=0) def Output(df): root = tk.Tk() root.title('Lens Data Output') frame = ttk.Frame(root, padding=5) frame.grid(row=0, column=0) # ツリービューの作成 tree = ttk.Treeview(frame) # 列インデックスの作成 tree['columns'] = (0,1,2,3,4) # 表スタイルの設定(headingsは通常の表形式) tree['show'] = 'headings' # 各列の設定(インデックス,オプション(今回は幅を指定)) for i in range(0,5): tree.column(i,width=100) # 各列のヘッダー設定(インデックス,テキスト) tree.heading(0, text='No.') tree.heading(1, text='曲率半径R') tree.heading(2, text='肉厚間隔T') tree.heading(3, text='硝材') tree.heading(4, text='有効径') for i in range(0, len(df)): item1 = df.iloc[i][0] item2 = df.iloc[i][1] item3 = df.iloc[i][2] item4 = df.iloc[i][3] item5 = df.iloc[i][4] # レコードの作成 # 1番目の引数-配置場所(表形式の表示ではブランクとする) # 2番目の引数-end:表の配置順序を最下部に配置 # (行インデックス番号を指定することもできる) # 3番目の引数-values:レコードの値をタプルで指定する tree.insert('', 'end', values=(item1, item2, item3, item4, item5)) # ツリービューの配置 tree.grid(row=0) # 保存ボタン def save(): fld = tk.filedialog.askdirectory(initialdir = 'C:') df.to_csv(fld + '/table.csv', encoding='shift-jis', index=False) button = ttk.Button(root, text='保存', command=save) button.grid(row=2, pady=5) root.mainloop() if __name__ == '__main__': Input()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

root.mainloop()button.grid(row=3, column=0) の後ろに移動すれば良いかと思います。


Python

1import pandas as pd 2import tkinter as tk 3import numpy as np 4import matplotlib.pyplot as plt 5from tkinter import ttk 6from tkinter import filedialog 7 8def Input(): 9 root = tk.Tk() 10 root.title('Lens Data Editor') 11 root.geometry('+800+200') # ウィンドウの表示位置を指定 12 13 frame = ttk.Frame(root) 14 frame.grid(row=0, column=0) 15 16 # 項目をつくる 17 items = ['No.', '曲率半径R', '肉厚間隔T', '硝材', '有効半径'] 18 for i in range(0, len(items)): 19 label_item = ttk.Label(frame, text=items[i]) 20 label_item.grid(row=0, column=i) 21 22 n = 20 # 行数 23 # 項目1 24 items1 = [0] * n 25 for i in range(0, n): 26 items1[i] = tk.IntVar() 27 item1 = ttk.Entry(frame, textvariable=items1[i], width=10) 28 item1.grid(row=i+1, column=0) 29 item1.insert(i, i) 30 31 # 項目2 32 items2 = [0] * n 33 for i in range(0, n): 34 items2[i] = tk.DoubleVar() 35 item2 = ttk.Entry(frame, textvariable=items2[i], width=10) 36 item2.grid(row=i+1, column=1) 37 38 # 項目3 39 items3 = [0] * n 40 for i in range(0, n): 41 items3[i] = tk.DoubleVar() 42 item3 = ttk.Entry(frame, textvariable=items3[i], width=10) 43 item3.grid(row=i+1, column=2) 44 45 # 項目4 46 items4 = [0] * n 47 for i in range(0, n): 48 items4[i] = tk.DoubleVar() 49 item4 = ttk.Entry(frame, textvariable=items4[i], width=10) 50 item4.grid(row=i+1, column=3) 51 52 # 項目5 53 items5 = [0] * n 54 for i in range(0, n): 55 items5[i] = tk.DoubleVar() 56 item5 = ttk.Entry(frame, textvariable=items5[i], width=10) 57 item5.grid(row=i+1, column=4) 58 59 60 # Enterが押された時の処理 61 def move_to_next_row(event): 62 # current position 63 info = event.widget.grid_info() 64 r, c = info['row'], info['column'] 65 # number of rows 66 nrows = frame.grid_size()[1] 67 # move to next row 68 r = (r + 1) if r < nrows-1 else r 69 frame.grid_slaves(row=r, column=c)[0].focus_set() 70 71 for w in frame.winfo_children(): 72 if isinstance(w, ttk.Entry): 73 w.bind('<Return>', move_to_next_row) 74 w.bind('<Down>', move_to_next_row) 75 76 77 # 上が押された時の処理 78 def move_to_prev_row(event): 79 # current position 80 info = event.widget.grid_info() 81 r, c = info['row'], info['column'] 82 # number of rows 83 # nrows = frame.grid_size()[1] 84 # move to next row 85 r = (r - 1) if r > 1 else r 86 frame.grid_slaves(row=r, column=c)[0].focus_set() 87 88 for w in frame.winfo_children(): 89 if isinstance(w, ttk.Entry): 90 w.bind('<Up>', move_to_prev_row) 91 92 93 # 右が押された時の処理 94 def move_to_right_row(event): 95 # current position 96 info = event.widget.grid_info() 97 r, c = info['row'], info['column'] 98 # number of columns 99 ncolumns = frame.grid_size()[1] 100 # move to next row 101 # c = (c + 1) if c > 1 else c 102 c = (c + 1) if c < ncolumns-1 else c 103 frame.grid_slaves(row=r, column=c)[0].focus_set() 104 105 for w in frame.winfo_children(): 106 if isinstance(w, ttk.Entry): 107 w.bind('<Right>', move_to_right_row) 108 109 110 # 左が押された時の処理 111 def move_to_left_row(event): 112 # current position 113 info = event.widget.grid_info() 114 r, c = info['row'], info['column'] 115 # number of columns 116 # ncolumns = frame.grid_size()[1] 117 # move to next row 118 c = (c - 1) if c > 1 else c 119 # c = (c + 1) if c < ncolumns-1 else c 120 frame.grid_slaves(row=r, column=c)[0].focus_set() 121 122 for w in frame.winfo_children(): 123 if isinstance(w, ttk.Entry): 124 w.bind('<Left>', move_to_left_row) 125 126 127 128 # 実行ボタン 129 def execute(): 130 #これまでの入力をリストに入れる 131 table_data = [] 132 for i in range(0, n): 133 table_data.append([items1[i].get(), 134 items2[i].get(), 135 items3[i].get(), 136 items4[i].get(), 137 items5[i].get()]) 138 # pandas dataframeに変換 139 df = pd.DataFrame(table_data, columns=['No.', '曲率半径R', '肉厚間隔T', '硝材', '有効径']) 140 141 # 結果表示 142 Output(df) 143 144 button = ttk.Button(root, text='計算', padding=5, command=execute) 145 button.grid(row=1, column=0) 146 147 #utton = ttk.Button(root, text='計算', padding=5, command=execute) 148 #utton.grid(row=3, column=0) 149 150 # レンズ描画 151 def lens_draw(): 152 153 # 新しいルートウィンドウを作成 154 root2 = tk.Tk() 155 root2.title('Lens Drawing') 156 root2.geometry('600x400') # ウィンドウのサイズを指定 157 158 # ウィンドウの内容を配置するフレームを作成 159 frame2 = ttk.Frame(root2) 160 frame2.grid(row=0, column=0) 161 162 max = 0 163 length = 0 164 165 for i in range(0, n): 166 if(items5[i].get()>0): 167 angle_1 = np.arcsin(items5[i].get()/items2[i].get()) 168 #angle_2 = np.arcsin(float(items5[i].get())/float(items2[i].get())) 169 tmp = items5[i].get() 170 if(tmp>max): 171 max = tmp 172 173 # Canvasを置く 174 canvas = tk.Canvas(root2, width = 600, height = 400, bg="white") 175 canvas.place(x = 0, y = 0) 176 #canvas.translate(width, height/2) 177 178 # 曲率半径を描く 179 if(items2[i].get()>0): 180 canvas.create_arc(length, items2[i].get(), length+2*items2[i].get(), -items2[i].get(), start=180-angle_1, extent=180+angle_1, style=tk.ARC) 181 if(items2[i].get()<0): 182 canvas.create_arc(length+2*items2[i].get(), -items2[i].get(), length, items2[i].get(), start=360+angle_1, extent=-angle_1, style=tk.ARC) 183 if(items2[i].get()==0): 184 canvas.create_line(length, items5[i].get(), length, items5[i].get()) 185 #fig, ax = plt.subplots() 186 #ax.add_patch(plt.arc(float(items2[i]), length + float(items2[i]), angle_1, angle_2)) 187 length = length + items3[i].get() 188 189 #ax.set_xlim([0, length]) 190 #ax.set_ylim([-max, max]) 191 #plt.axis('equal') # アスペクト比を保持 192 #plt.grid(True) # グリッド線を表示(任意) 193 #plt.show() 194 195 # ルートウィンドウをメインループで表示 196 root2.mainloop() 197 198 button = ttk.Button(root, text='描画', padding=5, command=lens_draw) 199 button.grid(row=2, column=0) 200 201 # root.mainloop() 202 203 204 # 途中経過の出力 205 def middle(): 206 207 max = 0 208 length = 0 209 210 for i in range(0, n): 211 if(items5[i].get()>0): 212 angle_1 = np.arcsin(items5[i].get()/items2[i].get()) 213 #angle_2 = np.arcsin(float(items5[i].get())/float(items2[i].get())) 214 tmp = items5[i].get() 215 if(tmp>max): 216 max = tmp 217 218 print(i+"回目") 219 print("items1[" + str(i) + "]:" + str(items1[i].get())) 220 print("items2[" + str(i) + "]:" + str(items2[i].get())) 221 print("items3[" + str(i) + "]:" + str(items3[i].get())) 222 print("items4[" + str(i) + "]:" + str(items4[i].get())) 223 print("items5[" + str(i) + "]:" + str(items5[i].get())) 224 print("angle_1:" + str(angle_1)) 225 226 227 button = ttk.Button(root, text='途中', padding=5, command=middle) 228 button.grid(row=3, column=0) 229 230 root.mainloop() 231 232def Output(df): 233 root = tk.Tk() 234 root.title('Lens Data Output') 235 236 frame = ttk.Frame(root, padding=5) 237 frame.grid(row=0, column=0) 238 239 # ツリービューの作成 240 tree = ttk.Treeview(frame) 241 242 # 列インデックスの作成 243 tree['columns'] = (0,1,2,3,4) 244 # 表スタイルの設定(headingsは通常の表形式) 245 tree['show'] = 'headings' 246 # 各列の設定(インデックス,オプション(今回は幅を指定)) 247 for i in range(0,5): 248 tree.column(i,width=100) 249 250 # 各列のヘッダー設定(インデックス,テキスト) 251 tree.heading(0, text='No.') 252 tree.heading(1, text='曲率半径R') 253 tree.heading(2, text='肉厚間隔T') 254 tree.heading(3, text='硝材') 255 tree.heading(4, text='有効径') 256 257 for i in range(0, len(df)): 258 item1 = df.iloc[i][0] 259 item2 = df.iloc[i][1] 260 item3 = df.iloc[i][2] 261 item4 = df.iloc[i][3] 262 item5 = df.iloc[i][4] 263 264 # レコードの作成 265 # 1番目の引数-配置場所(表形式の表示ではブランクとする) 266 # 2番目の引数-end:表の配置順序を最下部に配置 267 # (行インデックス番号を指定することもできる) 268 # 3番目の引数-values:レコードの値をタプルで指定する 269 tree.insert('', 'end', values=(item1, item2, item3, item4, item5)) 270 271 # ツリービューの配置 272 tree.grid(row=0) 273 274 # 保存ボタン 275 def save(): 276 fld = tk.filedialog.askdirectory(initialdir = 'C:') 277 df.to_csv(fld + '/table.csv', encoding='shift-jis', index=False) 278 279 button = ttk.Button(root, 280 text='保存', 281 command=save) 282 button.grid(row=2, pady=5) 283 284 root.mainloop() 285 286if __name__ == '__main__': 287 Input()

上記コードで下記が表示されました。
イメージ説明

投稿2023/05/28 14:41

編集2023/05/29 14:46
meg_

総合スコア10607

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

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

mizumimizu

2023/05/29 13:51

meg_さん、ご回答ありがとうございます。 下記のようにコードを修正したのですが、やはり途中ボタンが出現しません。 私の環境が何かいけないのでしょうか。。。 # 途中経過の出力 def middle(): max = 0 length = 0 for i in range(0, n): if(items5[i].get()>0): angle_1 = np.arcsin(items5[i].get()/items2[i].get()) #angle_2 = np.arcsin(float(items5[i].get())/float(items2[i].get())) tmp = items5[i].get() if(tmp>max): max = tmp print(i+"回目") print("items1[" + str(i) + "]:" + str(items1[i].get())) print("items2[" + str(i) + "]:" + str(items2[i].get())) print("items3[" + str(i) + "]:" + str(items3[i].get())) print("items4[" + str(i) + "]:" + str(items4[i].get())) print("items5[" + str(i) + "]:" + str(items5[i].get())) print("angle_1:" + str(angle_1)) button = ttk.Button(root, text='途中', padding=5, command=middle) button.grid(row=3, column=0) root.mainloop()
mizumimizu

2023/05/30 11:37

わかりました。 ご丁寧にどうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問