问题描述
这是我的代码:
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
设置 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()
和输出: