実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/05/29 13:51
2023/05/30 11:37