質問するログイン新規登録

回答編集履歴

4

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

2018/02/01 23:59

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -21,9 +21,11 @@
21
21
  import functools
22
22
  from tkinter import *
23
23
  import tkinter.ttk as ttk
24
+
24
25
  from selenium import webdriver
25
26
 
26
27
 
28
+ # メソッド名:task_runはあまり適切ではないかも!
27
29
  def task_run(url):
28
30
  # webdriverをcloseしていないので、リソースリークに注意
29
31
  #driver = webdriver.Chrome(r'C:\selenium\chromedriver')
@@ -35,30 +37,35 @@
35
37
  def __init__(self, master=None, **kw):
36
38
  super().__init__(master, **kw)
37
39
  self.style = ttk.Style()
38
- # tabメニューのpadding設定
40
+ # tabメニューのpadding設定
39
41
  self.style.configure('TNotebook.Tab', padding=(10, 0, 10, 0))
40
42
  self.tab_pages = OrderedDict()
41
43
  self.create_widgets()
42
44
 
43
45
  def create_widgets(self):
46
+ # rootコンポーネントのwidthとheigthを取得
47
+ width = self.master.winfo_width()
48
+ height = self.master.winfo_height()
44
- self.tab_pages['a'] = Frame(self, width=400, height=200, name='a')
49
+ self.tab_pages['tab_a'] = Frame(self, width=width, height=height)
45
- button_yahoo = Button(self.tab_pages['a'],
50
+ button_yahoo = Button(self.tab_pages['tab_a'],
46
- command=functools.partial(self.browser_open, 'https://www.yahoo.co.jp/'),
51
+ command=functools.partial(Notebook.browser_open, 'https://www.yahoo.co.jp/'),
47
52
  text='yahoo')
48
53
  button_yahoo.pack()
49
54
 
50
- self.tab_pages['b'] = Frame(self, width=400, height=150, name='b')
55
+ self.tab_pages['tab_b'] = Frame(self, width=width, height=height)
51
- button_google = Button(self.tab_pages['b'],
56
+ button_google = Button(self.tab_pages['tab_b'],
52
- command=functools.partial(self.browser_open, 'https://www.google.co.jp/'),
57
+ command=functools.partial(Notebook.browser_open, 'https://www.google.co.jp/'),
53
58
  text='google')
54
59
  button_google.pack()
55
- for i, v in self.tab_pages.items():
60
+ for key, val in self.tab_pages.items():
56
- v.pack()
61
+ val.pack()
62
+ # 登録されるtab名称(text)はOrderedDictのkey名
57
- self.add(v, text=i)
63
+ self.add(val, text=key)
58
64
  self.pack(expand=True, fill=BOTH)
59
65
 
66
+ @staticmethod
60
- def browser_open(self, url):
67
+ def browser_open(url):
61
- # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを回避するために別スレッドを生成する。
68
+ # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを防ぐために別スレッドを生成する。
62
69
  thr = threading.Thread(target=task_run, args=(url,))
63
70
  thr.start()
64
71
 
@@ -67,6 +74,7 @@
67
74
  root = Tk()
68
75
  root.title(u"Software Title")
69
76
  root.geometry("400x300")
77
+ root.update_idletasks()
70
78
  notebook = Notebook(root)
71
79
  root.mainloop()
72
80
 
@@ -74,6 +82,7 @@
74
82
  if __name__ == '__main__':
75
83
  main()
76
84
 
85
+
77
86
  ```
78
87
 
79
88
 

3

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

2018/02/01 23:59

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -58,6 +58,7 @@
58
58
  self.pack(expand=True, fill=BOTH)
59
59
 
60
60
  def browser_open(self, url):
61
+ # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを回避するために別スレッドを生成する。
61
62
  thr = threading.Thread(target=task_run, args=(url,))
62
63
  thr.start()
63
64
 

2

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

2018/02/01 16:36

投稿

umyu
umyu

スコア5846

answer CHANGED
File without changes

1

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

2018/02/01 16:28

投稿

umyu
umyu

スコア5846

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