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

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

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

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

Q&A

解決済

1回答

961閲覧

Python/tkinterのフォームでメニューにより内容を消したり点けたりしたい

ky_46

総合スコア92

Python 3.x

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

0グッド

0クリップ

投稿2018/02/01 07:00

前提・実現したいこと

現在、VBAを得意にしていますが、近い将来pytonがExcelに搭載されると聞き、pythonの勉強を始めました。anacondaとPyCharmをインストールして、教本やビデオ教材などを実行してみています。

その中で、pythonでもGUIプログラムが書けると聞いて試作してみたのですが、希望の動作にならないので、ご相談です。

該当のソースコード

python3

1#!/usr/bin/env python 2# -*- coding: utf8 -*- 3import sys 4from tkinter import * 5from selenium import webdriver 6 7def btn0_callback(): 8 driver = webdriver.Firefox() 9 driver.get("https://www.yahoo.co.jp/"); 10 11 12def btn1_callback(): 13 driver = webdriver.Firefox() 14 driver.get("https://www.google.co.jp/"); 15 16def mrnu1_callback(): 17 button0 = Button(root, text = 'A',command=btn0_callback) 18 button0.pack() 19 20def mrnu2_callback(): 21 button1 = Button(root, text = 'B',command=btn1_callback) 22 button1.pack() 23 24if __name__ == '__main__': 25 root = Tk() 26 root.title(u"Software Title") 27 root.geometry("400x300") 28 29 menu_ROOT = Menu(root) 30 root.configure(menu=menu_ROOT) 31 32 menu_ROOT.add_command(label='A',command=mrnu1_callback) 33 menu_ROOT.add_command(label='B',command=mrnu2_callback) 34 35 root.mainloop()

希望の動作

メニューのAを押したら、Aのボタンが現れ、ボタンを押すとYahoo!に飛ぶ
メニューのBを押したら、Aのボタンが消えて、Bのボタンが現れ、ボタンを押すとGoogleに飛ぶ
しかし、今はボタンが次々に増えてしまいます。

最終的にやたい事

メニューを選ぶと、ウィンドウの中でそのメニューにあったボタンやテキストボックスが配置されるという切り替え動作がしたいです。

VBAでは、タブオブジェクトというのがあって、タブごとにボタンやテキストボックスを配置していました。
pythonはExcelも操作できるようなので、最終的にはVBAで表示しているフォームや計算を、pythonに移したいです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

しかし、今はボタンが次々に増えてしまいます。

■原因

def mrnu1_callback():

button0 = Button(root, text = 'A',command=btn0_callback) button0.pack()

メニューをクリックした時にmrnu1_callbackを呼び出していますが、毎回Button()のコンストラクタをよんでいます。その為新しいインスタンスが生成されpackで追加されます。

■本題
TkinterのNotebookウィジットを使ったサンプルです。
質問者様が求めているのはこういうコードでしょうか?

Python

1#!/usr/bin/env python 2# -*- coding: utf8 -*- 3import sys 4import threading 5from collections import OrderedDict 6import functools 7from tkinter import * 8import tkinter.ttk as ttk 9 10from selenium import webdriver 11 12 13# メソッド名:task_runはあまり適切ではないかも! 14def task_run(url): 15 # webdriverをcloseしていないので、リソースリークに注意 16 #driver = webdriver.Chrome(r'C:\selenium\chromedriver') 17 driver = webdriver.Firefox() 18 driver.get(url) 19 20 21class Notebook(ttk.Notebook): 22 def __init__(self, master=None, **kw): 23 super().__init__(master, **kw) 24 self.style = ttk.Style() 25 # tabメニューのpaddingを設定 26 self.style.configure('TNotebook.Tab', padding=(10, 0, 10, 0)) 27 self.tab_pages = OrderedDict() 28 self.create_widgets() 29 30 def create_widgets(self): 31 # rootコンポーネントのwidthとheigthを取得 32 width = self.master.winfo_width() 33 height = self.master.winfo_height() 34 self.tab_pages['tab_a'] = Frame(self, width=width, height=height) 35 button_yahoo = Button(self.tab_pages['tab_a'], 36 command=functools.partial(Notebook.browser_open, 'https://www.yahoo.co.jp/'), 37 text='yahoo') 38 button_yahoo.pack() 39 40 self.tab_pages['tab_b'] = Frame(self, width=width, height=height) 41 button_google = Button(self.tab_pages['tab_b'], 42 command=functools.partial(Notebook.browser_open, 'https://www.google.co.jp/'), 43 text='google') 44 button_google.pack() 45 for key, val in self.tab_pages.items(): 46 val.pack() 47 # 登録されるtab名称(text)はOrderedDictのkey名 48 self.add(val, text=key) 49 self.pack(expand=True, fill=BOTH) 50 51 @staticmethod 52 def browser_open(url): 53 # webdriverの生成に時間がかかり、イベントディスパッチスレッドがブロックするのを防ぐために別スレッドを生成する。 54 thr = threading.Thread(target=task_run, args=(url,)) 55 thr.start() 56 57 58def main(): 59 root = Tk() 60 root.title(u"Software Title") 61 root.geometry("400x300") 62 root.update_idletasks() 63 notebook = Notebook(root) 64 root.mainloop() 65 66 67if __name__ == '__main__': 68 main() 69 70

■参考情報
0. tkinterでタブを実装
0. Changing the tab sizes of a Notebook widget in Python 3

0. collections.OrderedDict
0. functools.partial
0. threading.Thread

投稿2018/02/01 16:22

編集2018/02/01 23:59
umyu

総合スコア5846

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

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

ky_46

2018/02/05 01:37

ご返答遅くなって申し訳ありません。 確かに希望の動作です。 変更点をいろいろいじって、メニューの切り替えができるようにしてみたいと思います。 サンプルも参考にさせていただきます。VBAのフォームにあるタブも、pytonにあるのですね。調査不足でお恥ずかしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問