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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

602閲覧

Pythonのtkinterでウィジェットを関数として呼び出したい。

az_ura

総合スコア4

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/26 08:54

編集2023/02/01 10:40

前提.実現したいこと

python初心者です。

PythonのtkinterでGUIを作っています。
下記のコードで実行した際、うまくNotebookウィジェットが呼び出されず困っております。
原因をご教示いただけますと幸いです。

該当のソースコード

python

1import tkinter as tk 2from tkinter import ttk 3from tkinter import filedialog 4from tkcalendar import Calendar, DateEntry 5 6import ctypes 7 8try: 9 ctypes.windll.shcore.SetProcessDpiAwareness(True) 10except: 11 pass 12 13font_color = "black" 14bg_color_1 = "#9ecfcf" 15bg_color_2 = "#d9d9d9" 16 17class Application(tk.Frame): 18 def __init__(self, master=None): 19 super().__init__(master) 20 self.master.title("Application") 21 self.master.geometry("1000x600") 22 self.master.attributes("-topmost", True) 23 self.master.lift() 24 25 # 画面中央に表示 26 w = master.winfo_width() 27 h = master.winfo_height() 28 scw = master.winfo_screenwidth() 29 sch = master.winfo_screenheight() 30 geometry = "+{:d}+{:d}".format(int((scw - w) / 2), int((sch - h) / 2)) 31 self.master.geometry(geometry) 32 33 self.Notebooks() 34 35 # Notebook 36 def Notebooks(self): 37 nb = ttk.Notebook(self) 38 nb.place(relheight=1, relwidth=1) 39 40 # 条件タブ 41 nb_t1 = tk.Frame(nb) 42 nb.add(nb_t1) 43 nb.tab(0, text="tab1", compound="center") 44 nb_t1.configure(background=bg_color_1) 45 nb_t1.configure(highlightbackground=bg_color_2) 46 nb_t1.configure(highlightcolor=font_color) 47 48def main(): 49 root = tk.Tk() 50 master = root 51 app = Application(master) 52 app.mainloop() 53 54 55if __name__ == "__main__": 56 main()

試したこと

インスタンス化が上手くいっていないのか、
これと似た他のプログラムを回してみたのですがうまく表示されず頭を抱えております。

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

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

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

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

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

melian

2023/01/26 09:19

nb = ttk.Notebook(self) を nb = ttk.Notebook(self.master) に変更してみてください。
az_ura

2023/01/27 01:49

無事、動きました。 感謝致します。
guest

回答2

0

ベストアンサー

Notebooks メソッドは正常に呼び出されています。

問題点は2つ

  • Frame を継承した Application クラスのインスタンスが

 どこにも配置 (pack/grid/place) されていない。

  • Notebook の place では、座標サイズ指定が必要。

 rel height/width では割合でサイズを指定しますが、
配置先となる親の Application は未配置なので、基準となるサイズが定まっていない。

解決方法

  • main関数で mainloop 前に app.pack()
  • Notebooks メソッド内で place の代わりに nb.pack()

pack() にしたのは、ウィジェット表示させるための最低限の方法です。
用途に応じて pack/grid/placeを使い分け、必要なオプションを指定してください。

投稿2023/01/26 09:22

teamikl

総合スコア8664

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

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

0

melian様が返信してくださった通り、関数に渡す引数を
self ⇒ self.master
に変更すると反映されました。

皆様、ご協力ありがとうございました。

投稿2023/01/27 01:53

az_ura

総合スコア4

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

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

teamikl

2023/01/27 07:47 編集

Applicationクラスが継承しているフレームが、 生成されるが表示されないままのウィジェットとなるので、 (Frame を継承した Applicationクラス内で) Notebook の親を self.master にするのはお勧めしません。 改善するには、 Application クラスでFrameを継承しない、mainloop メソッドは root のを呼び出す等、 クラス・ウィジェットの構成を見直す必要が出てきます。
az_ura

2023/02/01 01:27

承知致しました。 見直してみます。
az_ura

2023/02/01 01:40

「Application クラスでFrameを継承しない、mainloop メソッドは root のを呼び出す」を行い無事動きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問