🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Tkinter

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

Python

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

Q&A

解決済

1回答

4019閲覧

python tkinterのttkthemesの使用で、背景が上手く適用されない

Yuiti628

総合スコア71

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/02/27 10:37

pythonのtkinterを使ってGUIを作成しております。
ttkthemesのテーマを使用したいのですが、どうもrootの背景部分に適用されずに変な状態になっています。

今回は分かりやすいようにs.theme_use('black')にしました。
一番外枠の色が変わらないのは何故でしょうか?

イメージ説明

##該当のソースコード

python

1''' mmain ''' 2# tkinter 3import tkinter as tk 4from tkinter.ttk import * 5from ttkthemes import * 6from tkscrolledframe import ScrolledFrame 7 8class Application(Frame): 9 10 def __init__(self, master=None): 11 Frame.__init__(self,master) 12 master.configure(bg="white") 13 master.resizable(width=False, height=False) 14 15 self.pack() #描写 16 self.create_widgets(master) #フォームの作成 17 18 19 20 #フォームの作成 21 def create_widgets(self,master): 22 23 s = Style() 24 s.theme_use('black') 25 """ 26 スクロールバー フレーム 27 """ 28 # スクロールバー フレーム 29 Frm5 = Frame(master ) 30 Frm5.pack(padx=10 ,pady=5, fill="both") 31 32 33 # スクロールバー フレーム 34 Sfram = ScrolledFrame(Frm5 , height=185) 35 Sfram._x_scrollbar.grid_forget() #水平方向のバーを削除 36 Sfram.grid(row=2, column=0, sticky="nw") 37 Sfram.bind_arrow_keys(root) 38 Sfram.bind_scroll_wheel(root) 39 40 41 # 中のフレーム 42 inner_frame = Sfram.display_widget(Frame) 43 44 """ 45 アカウント名 , アイコンパス , メールアドレス , アイコン画像 ヘッダー 46 """ 47 # No ラベル 48 L_no = Label(inner_frame) 49 L_no.configure(text="No") 50 L_no.grid(row=0, column=0 ,pady=5) 51 52 # アカウント名 ラベル 53 L_account = Label(inner_frame) 54 L_account.configure(text="アカウント名" ) 55 L_account.grid(row=0, column=1,pady=5,padx=5) 56 57 # アイコンのファイル名 ラベル 58 L_account = Label(inner_frame) 59 L_account.configure(text="アイコンのファイル名" ) 60 L_account.grid(row=0, column=2,pady=5,padx=5) 61 62 # メールアドレス ラベル 63 L_mail = Label(inner_frame) 64 L_mail.configure(text="メールアドレス" ) 65 L_mail.grid(row=0, column=3 ,pady=5) 66 67 68 69 70 """ 71 アカウント名 , アイコンパス , メールアドレス , アイコン画像 72 """ 73 74 self.Widget_items = [] 75 for i in range(10): 76 items = [] 77 78 # No ラベル 79 self.L_no1 = Label(inner_frame) 80 self.L_no1.configure(text=f"{i+1}") 81 self.L_no1.grid(row=i +1, column=0) 82 83 # アカウント名 テキストボックス 84 Text_aka = tk.StringVar() 85 self.aka_box = Entry(inner_frame,textvariable=Text_aka ,width = 25) 86 self.aka_box.grid(row=i +1, column=1, sticky="nw") 87 items.append(self.aka_box) 88 89 90 # アイコンのファイル名とキャンバスのセット 91 ifrma = Frame(inner_frame) 92 ifrma.grid(row=i +1, column=2, sticky="nw") 93 94 # アイコンのファイル名 テキストボックス 95 96 Text_icon = tk.StringVar() 97 self.icon_box = Entry(ifrma,textvariable=Text_icon ,width = 15) 98 self.icon_box.grid(row=0, column=0, sticky="nw") 99 items.append(self.icon_box) 100 101 # アイコンの表示 102 self.canvas2 = tk.Canvas(ifrma , width=24 , height=24) 103 self.canvas2.grid(row=0, column=1) 104 items.append(self.canvas2) 105 106 # アカウント名 テキストボックス 107 Text_mail1 = tk.StringVar() 108 self.mail1_box = Entry(inner_frame , textvariable=Text_mail1 ,width = 25 ,foreground='black') 109 self.mail1_box.grid(row=i +1, column=3, sticky="n") 110 items.append(self.mail1_box) 111 112 # アイコンの表示 113 self.load_canvas = tk.Canvas(inner_frame , width=24 , height=24) 114 self.load_canvas.grid(row=i +1, column=4) 115 items.append(self.load_canvas) 116 117 118 self.Widget_items.append(items) 119 120 121 # サイズ調整 122 root.update() 123 Sfram.config(width=inner_frame.winfo_width()) 124 125 126 127 128 129 130 131 132 133if __name__ == "__main__": 134 135 136 root = ThemedTk() 137 root.option_add('*font', ('Ricty Diminished', 12)) 138 app = Application(master=root) 139 app.mainloop() 140

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

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

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

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

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

guest

回答1

0

ベストアンサー

ttk 適用外の為です。

追記:

diff

1- self.create_widgets(master) #フォームの作成 2+ self.create_widgets(self) #フォームの作成

問題点: ここでの master は root オブジェクト (ttk非対応) なので、
解決策: self (ttk.Frame) を親ウィジェットに渡すことで解消できます。

元のコードの間違い: Frame を継承していて create_widgets に master を渡すと、
空の Frame を余分に作っていることになります。


以前の回答

python

1# 問題点: padding は Frame の範囲外。余白部分は 親ウィジェット(master) の色になる。 2 3 Frm5 = Frame(master) 4 Frm5.pack(padx=10, pady=5, fill="both") 5 6# 外側に ttk.Frame を親ウィジェットとして設ける 7 8 parent = Frame(master) 9 parent.pack(fill="both", expand="yes) 10 Frm5 = Frame(parent) 11 Frm5.pack(padx=10, pady=5, fill="both")
  • ScrolledFrame ... tk.Frame / (内部で使われてる) Canvas

 ※ 注意点: tkscrolledframe モジュール自体は ttk 利用を想定してるようですが、
ScrolledFrame 自身は tk.Frame を継承してるので、ttk 適用外です。
微妙な枠の色が気になる場合は、従来の方法で指定。ScrolledFrame(..., bg="red")

  • 他の白くなってる部分は、tkinter.Canvas なので theme 適用外です。

 ttk に対応してないウィジェット。tkinter.Text、tkinter.Canvas

投稿2021/02/27 11:34

編集2021/02/27 11:46
teamikl

総合スコア8738

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

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

Yuiti628

2021/02/27 12:43

ありがとうございました!!!!!!!! self.create_widgets(self) でできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問