69568


python3.8  
reliefで設定した枠線の太さを変更したいです。  
tkで使えていた borderwidth= では枠自体は広がるようですが線は変わってくれません。  
よろしくお願いします。

[code]

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    root.geometry("400x300")
    
    fr = ttk.Frame(root)
    fr.place(relwidth=1, relheight=1)
    
    fr2 = ttk.Frame(fr, relief="solid", borderwidth=30) #ここ
    fr2.place(anchor="center", relx=1/2, rely=1/2, width=200, height=150)
    fr2.propagate(False)
    
    label = ttk.Label(fr2, text="Label")
    label.pack(pady=1)
    
    root.mainloop()
    
[/code]


CC BY-SA 4.0
2020-08-14T14:03:44.760
69556
2020-08-15T04:41:22.977
2020-08-14T23:45:17.760
41499
41499
question
python tkinter
Frameに枠線をつけてその太さを変更したい


おそらく以下の内容により互換性が無いものと思われます。

[tkinter.ttk --- Tk
のテーマ付きウィジェット](https://docs.python.org/ja/3/library/tkinter.ttk.html)

> Ttk を使う
>
>
> これにはプラットフォームをまたいでより良い見た目を得られるという、直接的な利益がありますが、ウィジェットは完全な互換性を持っているわけではありません。一番の違いは
> "fg" や "bg" やその他のスタイルに関係するウィジェットのオプションが Ttk ウィジェットから無くなっていることです。同じ
> (もしくはより良い) 見た目にするためには ttk.Style を使ってください。

[Ttk ウィジェット](https://docs.python.org/ja/3/library/tkinter.ttk.html#ttk-
widgets)

> Ttk のコード:
[code]

>     style = ttk.Style()
>     style.configure("BW.TLabel", foreground="black", background="white")
>  
>     l1 = ttk.Label(text="Test", style="BW.TLabel")
>     l2 = ttk.Label(text="Test", style="BW.TLabel")
>  
[/code]

上記を元にすると、`relief="solid"`の時だけ使える代替手段として`ttk.Frame`を入れ子にして外側フレームの背景色を枠線のように見せる方法が、以下のような感じで出来るでしょう。

[code]

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    root.geometry("400x300")
    
    fr = ttk.Frame(root)
    fr.place(relwidth=1, relheight=1)
    
    s = ttk.Style()
    s.configure('border.TFrame', background='#000000') ## 枠線用スタイルの色
    
    bdrfr = ttk.Frame(fr, style='border.TFrame')       ## 枠線用の外側フレーム
    bdrfr.place(anchor='center', relx=1/2, rely=1/2, width=200, height=150)
    bdrfr.propagate(False)
    
    clifr = ttk.Frame(bdrfr)                           ## 枠線用の内側フレーム
    clifr.place(anchor='center', relx=1/2, rely=1/2, width=120, height=90)
    clifr.propagate(False)
    
    label = ttk.Label(clifr, text="Label")
    label.pack(pady=1)
    
    root.mainloop()
    
[/code]

似たようなことが`LabelFrame`で出来るようですが、これはこれで使いこなすのにはノウハウが必要そうです。  
[ttk: how to make a frame look like a
labelframe?](https://stackoverflow.com/q/12426315/9014308)  
[How to Change Tkinter LableFrame Border
Color](https://stackoverflow.com/q/42958927/9014308)  
[【Python GUI Tkinterリファレンス】ttk.LabelFrame(ラベルフレーム)のオプション](https://suzutaka-
programming.com/tkinter-ttk-labelframe-option/)


CC BY-SA 4.0
2020-08-15T04:41:22.977
69568
2020-08-15T04:41:22.977
26370
69556
answer