Почему я не могу установить фон кадра ttk?

#python #python-3.x #tkinter #ttk

Вопрос:

Это мой код:

 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()
 

Комментарии:

1. Воспользуйся canvas.config(bg=<background colour>)

2. Сначала , когда вы звоните s.configure(...) , canvas.winfo_width() и canvas.winfo_height() 1 (вы можете использовать print() , чтобы показать их). Во-вторых width , и height их нельзя установить с помощью s.configure() , укажите их ttk.Frame(...) вместо этого. Также для отладки используйте для них разные цвета.

3. Ничего из этого не работает…

4. msgFrame.pack(fill="both", expand="yes") и используйте другой цвет. я думаю, что вы не определили цвет (поэтому я протестировал его с green помощью, нет никаких проблем)

5. @JoeMo обычно pack/grid/place не используются для размещения виджета в a Canvas . Используйте create_window(...) , как делает ОП.

Ответ №1:

Сначала, используя один и тот же цвет фона для всех виджетов, трудно увидеть эффект. Для целей отладки используйте разные цвета фона для разных виджетов.

Во-вторых , вы не можете установить width и height ttk::Frame использования style.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()
 

И результат:

введите описание изображения здесь