現在2つの同じフォーマットで作られたエクセルを比較するスクリプトを書いています。
その操作をGUI上で行いたいと思い、TKINTERを使用しています。
私の設計では大枠のWindowの中に6つのTabがあり、それぞれのタブで比較した結果が表示されるようにしたいです。
そして、大枠のWindowと各TAB内に作られるFrameにスクロールバーを設置しているつもりなのですが表示されません。
存在自体はありそうなのですが機能していない状況です。
スクロールバーについて別の質問なのですが、Treeview内でマウスのホイールでスクロールできるものとできないものがあります。
これは何が原因となっているのでしょうか。全てホイールでスクロールできるようにできるならそうしたいです。
よろしくお願いします。
python
1 2import tkinter as tk 3from tkinter import ttk 4import CostAnalysis 5import tkinter.scrolledtext as tksc 6 7 8def init_notebook(notebook): 9 10 for name, tab_name, class_name in zip(['Main', 'Upper', 'Sole', 'Sole Paint', 'Sundries', 'Packing'], 11 ['Main', 'Upper', 'Sole', 'Sole Paint', 'Sundries', 'Packing'], 12 [Main, Upper, Sole, SolePaint, Sundries, Packing]): 13 name = ttk.Frame(notebook) 14 notebook.add(name, text=tab_name) 15 class_name(master=name) 16 17 return notebook 18 19 20class ScrolledCanvas(tk.Canvas): 21 22 def __init__(self, master, *args, **kw): 23 super().__init__(master, *args, **kw) 24 25 bar_y = ttk.Scrollbar(self, orient=tk.VERTICAL) 26 bar_y.pack(side=tk.RIGHT, fill=tk.Y) 27 bar_y.config(command=self.yview) 28 29 bar_x = ttk.Scrollbar(self, orient=tk.HORIZONTAL) 30 bar_x.pack(side=tk.BOTTOM, fill=tk.X) 31 bar_x.config(command=self.yview) 32 33 self.config( 34 yscrollcommand=bar_y.set, 35 xscrollcommand=bar_x.set, 36 scrollregion=self.bbox("all"), 37 ) 38 39class MainWindow(ttk.Frame): 40 def __init__(self, master): 41 super().__init__(master) 42 43 canvas = ScrolledCanvas(self, width=2000, height=1000) 44 canvas.pack(fill=tk.BOTH, expand=True) # <- 配置は利用側で決める 45 46 notebook = init_notebook(ttk.Notebook(self)) 47 notebook.pack(fill=tk.BOTH, expand=True) 48 49 canvas.create_window((0, 0), 50 window=notebook, anchor=tk.NW, width=canvas.cget('width')) 51 52 self.canvas = canvas 53 self.notebook = notebook 54 55 56class Main(tk.Frame): 57 global result 58 result = CostAnalysis.data_scraping() 59 60 def __init__(self, master): 61 super().__init__(master) 62 self.pack(fill=tk.BOTH, expand=True) 63 self._MainCost_widget(result[0], 'File1 Basic information') 64 self._MainCost_widget(result[1], 'File2 Basic information') 65 self._MainCost_widget(result[2], 'File1 Cost information') 66 self._MainCost_widget(result[3], 'File2 Cost information') 67 self._MainCost_widget(result[4], 'Difference Cost information') 68 self._warning_frame(result[5]) 69 70 def _MainCost_widget(self, cost_info, txt): 71 frame_file = tk.LabelFrame(self, text=txt, width=1900, height=200, bg='#fff', fg='Blue') 72 frame_file.pack(pady=10, anchor=tk.NW) 73 74 for i in cost_info: 75 b = tk.LabelFrame(frame_file, text=i, bg='#fff') 76 c = tk.Label(b, text=cost_info[i], bg='#fff') 77 [widget.pack(side=tk.LEFT) for widget in (b, c)] 78 79 def _warning_frame(self, warning): 80 scrolledtext = tksc.ScrolledText(self, height=20, width=200, bg='black', fg='green') 81 scrolledtext.configure(highlightbackground='red') 82 scrolledtext.insert(tk.END, warning) 83 scrolledtext.pack() 84 85 86class Upper(tk.Frame): 87 def __init__(self, master): 88 super().__init__(master) 89 self.pack(fill=tk.BOTH, expand=True) 90 upper_result = result[6:10] 91 for i, name in enumerate(['Remove', 'Add', 'Changed point', 'Nothing Change']): 92 self._result_frame(name, upper_result[i]) 93 94 def _result_frame(self, name, upper_result): 95 remove = tk.Frame(self) 96 remove_label = tk.Label(remove, text=name) 97 remove_frame = tk.Frame(self, bg='#fff') 98 [widget.pack() for widget in (remove, remove_label)] 99 remove_frame.pack(fill=tk.BOTH, expand=True) 100 101 canvas = tk.Canvas(remove_frame, width=1900, height=300) 102 # Scrollbar を生成して配置 103 bar_y = tk.Scrollbar(canvas, orient=tk.VERTICAL) 104 bar_y.pack(side=tk.RIGHT, fill=tk.Y) 105 bar_y.config(command=canvas.yview) 106 107 bar_x = tk.Scrollbar(remove_frame, orient=tk.HORIZONTAL) 108 bar_x.pack(side=tk.BOTTOM, fill=tk.X) 109 bar_x.config(command=canvas.xview) 110 111 # Treeviewの作成 112 tree = ttk.Treeview(canvas) 113 tree["column"] = list(upper_result.columns) 114 tree["show"] = "headings" 115 # ヘッダーテキスト 116 117 for i in range(len(list(upper_result.columns))): 118 tree.heading(upper_result.columns[i], text=upper_result.columns[i]) 119 # 列の幅 120 tree.column(upper_result.columns[i], width=30) 121 for j in range(len(list(upper_result.index))): 122 # データ挿入 123 tree.insert("", "end", values=(list(upper_result.iloc[j]))) 124 125 # 設置 126 tree.pack(fill=tk.BOTH, expand=True) 127 # Canvas Widget を配置 128 canvas.config(yscrollcommand=bar_y.set, xscrollcommand=bar_x.set) 129 canvas.config(scrollregion=(0, 0, 4000, 5000)) # スクロール範囲 130 canvas.create_window((0, 0), window=tree, anchor=tk.NW, width=canvas.cget('width')) 131 canvas.pack(fill=tk.BOTH, expand=True) 132 133# 以下同じ様に各タブ用のFrameクラスを作成しました。省略します。 134 135def main(): 136 root = tk.Tk() 137 root.geometry("2000x1000") 138 root.title("テスト") 139 140 win = MainWindow(root) 141 win.pack(fill=tk.BOTH, expand=True) 142 143 root.mainloop() 144 145 146if __name__ == '__main__': 147 main() 148
回答1件
あなたの回答
tips
プレビュー