回答編集履歴

4

コメントを追加とroot.update_idletasks()を呼び出して、width とheight を取得できるように変更!

2018/02/01 23:59

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -44,11 +44,15 @@
44
44
 
45
45
  import tkinter.ttk as ttk
46
46
 
47
+
48
+
47
49
  from selenium import webdriver
48
50
 
49
51
 
50
52
 
51
53
 
54
+
55
+ # メソッド名:task_runはあまり適切ではないかも!
52
56
 
53
57
  def task_run(url):
54
58
 
@@ -72,7 +76,7 @@
72
76
 
73
77
  self.style = ttk.Style()
74
78
 
75
- # tabメニューのpadding設定
79
+ # tabメニューのpadding設定
76
80
 
77
81
  self.style.configure('TNotebook.Tab', padding=(10, 0, 10, 0))
78
82
 
@@ -84,11 +88,17 @@
84
88
 
85
89
  def create_widgets(self):
86
90
 
87
- self.tab_pages['a'] = Frame(self, width=400, height=200, name='a')
91
+ # rootコンポーネントのwidthheigthを取得
88
92
 
89
- button_yahoo = Button(self.tab_pages['a'],
93
+ width = self.master.winfo_width()
90
94
 
95
+ height = self.master.winfo_height()
96
+
97
+ self.tab_pages['tab_a'] = Frame(self, width=width, height=height)
98
+
99
+ button_yahoo = Button(self.tab_pages['tab_a'],
100
+
91
- command=functools.partial(self.browser_open, 'https://www.yahoo.co.jp/'),
101
+ command=functools.partial(Notebook.browser_open, 'https://www.yahoo.co.jp/'),
92
102
 
93
103
  text='yahoo')
94
104
 
@@ -96,29 +106,33 @@
96
106
 
97
107
 
98
108
 
99
- self.tab_pages['b'] = Frame(self, width=400, height=150, name='b')
109
+ self.tab_pages['tab_b'] = Frame(self, width=width, height=height)
100
110
 
101
- button_google = Button(self.tab_pages['b'],
111
+ button_google = Button(self.tab_pages['tab_b'],
102
112
 
103
- command=functools.partial(self.browser_open, 'https://www.google.co.jp/'),
113
+ command=functools.partial(Notebook.browser_open, 'https://www.google.co.jp/'),
104
114
 
105
115
  text='google')
106
116
 
107
117
  button_google.pack()
108
118
 
109
- for i, v in self.tab_pages.items():
119
+ for key, val in self.tab_pages.items():
110
120
 
111
- v.pack()
121
+ val.pack()
112
122
 
123
+ # 登録されるtab名称(text)はOrderedDictのkey名
124
+
113
- self.add(v, text=i)
125
+ self.add(val, text=key)
114
126
 
115
127
  self.pack(expand=True, fill=BOTH)
116
128
 
117
129
 
118
130
 
119
- def browser_open(self, url):
131
+ @staticmethod
120
132
 
133
+ def browser_open(url):
134
+
121
- # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを回避するために別スレッドを生成する。
135
+ # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを防ぐために別スレッドを生成する。
122
136
 
123
137
  thr = threading.Thread(target=task_run, args=(url,))
124
138
 
@@ -136,6 +150,8 @@
136
150
 
137
151
  root.geometry("400x300")
138
152
 
153
+ root.update_idletasks()
154
+
139
155
  notebook = Notebook(root)
140
156
 
141
157
  root.mainloop()
@@ -147,6 +163,8 @@
147
163
  if __name__ == '__main__':
148
164
 
149
165
  main()
166
+
167
+
150
168
 
151
169
 
152
170
 

3

コメントでスレッドを生成する理由を明示

2018/02/01 23:59

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -118,6 +118,8 @@
118
118
 
119
119
  def browser_open(self, url):
120
120
 
121
+ # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを回避するために別スレッドを生成する。
122
+
121
123
  thr = threading.Thread(target=task_run, args=(url,))
122
124
 
123
125
  thr.start()

2

どうして質問の問題が起きるのかの解説文を追加

2018/02/01 16:36

投稿

umyu
umyu

スコア5846

test CHANGED
File without changes

1

どうして質問の問題が起きるのかの解説文を追加

2018/02/01 16:28

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,3 +1,25 @@
1
+ > しかし、今はボタンが次々に増えてしまいます。
2
+
3
+
4
+
5
+ ■原因
6
+
7
+
8
+
9
+ > def mrnu1_callback():
10
+
11
+ button0 = Button(root, text = 'A',command=btn0_callback)
12
+
13
+ button0.pack()
14
+
15
+
16
+
17
+ メニューをクリックした時にmrnu1_callbackを呼び出していますが、毎回Button()のコンストラクタをよんでいます。その為新しいインスタンスが生成されpackで追加されます。
18
+
19
+
20
+
21
+ ■本題
22
+
1
23
  TkinterのNotebookウィジットを使ったサンプルです。
2
24
 
3
25
  質問者様が求めているのはこういうコードでしょうか?