为什么我不能设置 ttk Frame 的背景?

问题描述

这是我的代码

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.protocol("WM_DELETE_WINDOW",lambda: on_closing(root,btn))
frame1 = tk.Frame(root,bg=root['background'])
frame1.pack(expand="YES")

canvas = tk.Canvas(frame1,width=200,height=300,relief="sunken",bd=0,bg=root['background'])
scroll_y = tk.Scrollbar(frame1,orient="vertical",command=canvas.yview,bg=canvas['background'])
scroll_y.pack(side="right",fill='y')
canvas.pack(side="top",expand='YES',fill='both')
canvas.configure(yscrollcommand=scroll_y.set)
# canvas.update_idletasks()
# canvas.yview_moveto('1.0')
s = ttk.Style()
s.configure("new.TFrame",background=canvas['background'],width=canvas.winfo_width(),height=canvas.winfo_height())
msgFrame = ttk.Frame(canvas,style="new.TFrame")
msgFrame.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bBox("all")))
canvas.create_window((0,0),window=msgFrame,anchor="nw")

为什么框架不会改变颜色?还是它的宽度/高度?

如果您想在框架中放置一些字符串:

for i in range (50):
   lbl = tk.Label(msgFrame,text="example").pack()

解决方法

首先对所有小部件使用相同的背景颜色很难看到效果。出于调试目的,请为不同的小部件使用不同的背景颜色。

其次,您不能使用 width 设置 heightttk::Framestyle.configure(),请在 ttk::Frame(...) 中指定它们。

以下是基于您的代码的修改示例:

import tkinter as tk
from tkinter import ttk

def on_closing(root):
    root.destroy()

root = tk.Tk()
root.geometry("400x400")
root.config(bg="cyan")
root.protocol("WM_DELETE_WINDOW",lambda: on_closing(root))

frame1 = tk.Frame(root,bg="red")
frame1.pack(expand="YES")

canvas = tk.Canvas(frame1,width=200,height=300,relief="sunken",bd=0,bg="green")
scroll_y = tk.Scrollbar(frame1,orient="vertical",command=canvas.yview,bg=canvas['background'])
scroll_y.pack(side="right",fill='y')
canvas.pack(side="top",expand='YES',fill='both')
canvas.configure(yscrollcommand=scroll_y.set)
s = ttk.Style()
s.configure("new.TFrame",background="blue")
msgFrame = ttk.Frame(canvas,style="new.TFrame",width=100,height=200) # set width and height
msgFrame.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
canvas.create_window((0,0),window=msgFrame,anchor="nw")

root.mainloop()

和输出:

enter image description here